面向对象和数据结构
使用对象封装#
在 PHP 中,您可以为方法设置 public
、protected
和 private
关键字。使用它,您可以控制对象的属性修改。
-
当您想要做的不仅仅是获取对象属性时,您不必查找和更改代码库中的每个访问器。
-
在执行「设置」时使添加验证变得简单。
-
封装内部表现形式。
-
获取和设置时易于添加日志记录和错误处理。
-
继承此类,您可以覆盖默认功能。
-
您可以延迟加载对象的属性,比如说从服务器获取它。
此外,这是 开闭原则 的一部分。
Bad:
class BankAccount
{
public $balance = 1000;
}
$bankAccount = new BankAccount();
// Buy shoes...
$bankAccount->balance -= 100;
Good:
class BankAccount
{
private $balance;
public function __construct(int $balance = 1000)
{
$this->balance = $balance;
}
public function withdraw(int $amount): void
{
if ($amount > $this->balance) {
throw new \Exception('Amount greater than available balance.');
}
$this->balance -= $amount;
}
public function deposit(int $amount): void
{
$this->balance += $amount;
}
public function getBalance(): int
{
return $this->balance;
}
}
$bankAccount = new BankAccount();
// Buy shoes...
$bankAccount->withdraw($shoesPrice);
// Get balance
$balance = $bankAccount->getBalance();
使对象具有私有 / 受保护属性#
public
方法和属性对于更改是最危险的,因为一些外部代码可能很容易依赖它们,而您无法控制哪些代码依赖它们。 类中的修改对类的所有用户都是危险的。protected
修饰符与 public 一样危险,因为它们在任何子类的范围内都可用。 这实际上意味着 public 和 protected 之间的区别仅在于访问机制,但封装保证保持不变。类中的修改对所有后代类都是危险的。private
修饰符保证代码 仅在单个类的边界内修改是危险的(您可以安全地修改并且不会有 叠叠乐效应).
因此,当需要为外部类提供访问权限时,默认情况下使用 private
和 public/protected
。
有关更多信息,请阅读关于这个话题的 博客推文,作者 Fabien Potencier.
坏的:
class Employee
{
public $name;
public function __construct(string $name)
{
$this->name = $name;
}
}
$employee = new Employee('John Doe');
// Employee name: John Doe
echo 'Employee name: ' . $employee->name;
好的:
class Employee
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
}
$employee = new Employee('John Doe');
// Employee name: John Doe
echo 'Employee name: ' . $employee->getName();
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
推荐文章: