PHP private 关键字
最后修改于 2025 年 4 月 16 日
PHP private
关键字是面向对象编程中使用的可见性修饰符。 它将对类成员(属性和方法)的访问限制为仅在类本身内部进行。 这实现了封装。
基本定义
private
关键字使类成员无法从类外部访问。 这包括扩展父类的子类。 私有成员只能在同一类中访问。
私有可见性比 protected
(允许子类访问)和 public
(允许任何访问)更严格。 它是 PHP 中限制最严格的可见性修饰符。
语法:属性使用 private $propertyName;
,方法使用 private function methodName() {}
。 私有成员有助于防止从类外部意外修改。
基本私有属性
此示例演示了一个具有私有属性的简单类。
<?php declare(strict_types=1); class BankAccount { private float $balance = 0.0; public function deposit(float $amount): void { $this->balance += $amount; } public function getBalance(): float { return $this->balance; } } $account = new BankAccount(); $account->deposit(100.50); echo "Balance: " . $account->getBalance();
$balance
属性是私有的,不能直接访问。 我们使用公共方法与其交互。 这可以保护余额不被直接修改。 deposit 方法确保了受控访问。
私有方法
此示例显示了一个具有私有辅助方法的类。
<?php declare(strict_types=1); class User { private string $username; public function __construct(string $username) { $this->username = $this->sanitizeUsername($username); } private function sanitizeUsername(string $username): string { return trim(strtolower($username)); } public function getUsername(): string { return $this->username; } } $user = new User(" Admin "); echo "Username: " . $user->getUsername();
sanitizeUsername
方法是私有的,并在内部使用。 它在存储用户名之前对其进行处理。 外部代码不能直接调用此方法。 这隐藏了实现细节。
私有构造函数
此示例演示了使用私有构造函数来实现单例模式。
<?php declare(strict_types=1); class Database { private static ?Database $instance = null; private function __construct() { // Private constructor prevents direct instantiation } public static function getInstance(): Database { if (self::$instance === null) { self::$instance = new Database(); } return self::$instance; } } $db = Database::getInstance();
私有构造函数阻止使用 new
创建实例。 类通过 getInstance
控制其实例化。 这确保只存在一个实例。 这是一个常见的单例模式。
继承中的私有
此示例显示了私有成员在继承中的行为方式。
<?php declare(strict_types=1); class ParentClass { private string $secret = "Parent secret"; protected string $familySecret = "Family secret"; public function reveal(): void { echo $this->secret; // Accessible here } } class ChildClass extends ParentClass { public function tryReveal(): void { // echo $this->secret; // Error: Cannot access private property echo $this->familySecret; // Works: protected is accessible } } $child = new ChildClass(); $child->reveal(); $child->tryReveal();
私有 $secret
在子类中不可访问。 受保护的 $familySecret
是可访问的。 这显示了私有和受保护可见性之间的区别。
私有静态属性
此示例演示了一个具有计数器的私有静态属性。
<?php declare(strict_types=1); class Counter { private static int $count = 0; public function __construct() { self::$count++; } public static function getCount(): int { return self::$count; } } new Counter(); new Counter(); new Counter(); echo "Count: " . Counter::getCount();
私有静态 $count
跟踪所有对象中的实例。 它在所有实例之间共享,但不能直接访问。 静态方法提供了对计数器的受控访问。
私有常量
此示例显示了 PHP 7.1 中引入的私有类常量。
<?php declare(strict_types=1); class MathOperations { private const PI = 3.14159265359; public static function circleArea(float $radius): float { return self::PI * $radius * $radius; } } echo "Area: " . MathOperations::circleArea(5); // echo MathOperations::PI; // Error: Cannot access private constant
私有常量 PI
仅在类中可访问。 它被 circleArea
方法内部使用。 常量不能被修改,但私有常量限制了它们的可访问性。
通过反射访问私有属性
此高级示例演示了使用反射访问私有属性。
<?php declare(strict_types=1); class SecretHolder { private string $secret = "Top secret"; } $holder = new SecretHolder(); $reflector = new ReflectionClass($holder); $property = $reflector->getProperty('secret'); $property->setAccessible(true); echo "The secret is: " . $property->getValue($holder);
反射可以绕过私有可见性,用于测试等特殊情况。 应该谨慎使用,因为它会破坏封装。 该示例获取私有属性值,尽管它具有可见性。
最佳实践
- 封装: 默认情况下将属性设为私有。
- 访问器: 使用公共 getter/setter 进行受控访问。
- 辅助方法: 将内部方法标记为私有。
- 不可变对象: 将私有属性与只读属性结合使用。
- 文档: 为维护人员记录私有成员。
来源
本教程涵盖了 PHP private 关键字,并提供了实用示例,展示了属性、方法、构造函数和常量在各种场景中的用法。
作者
列出 所有 PHP 教程。