面向对象和数据结构

未匹配的标注

使用对象封装

在 PHP 中,您可以为方法设置 publicprotectedprivate 关键字。使用它,您可以控制对象的属性修改。

  • 当您想要做的不仅仅是获取对象属性时,您不必查找和更改代码库中的每个访问器。

  • 在执行「设置」时使添加验证变得简单。

  • 封装内部表现形式。

  • 获取和设置时易于添加日志记录和错误处理。

  • 继承此类,您可以覆盖默认功能。

  • 您可以延迟加载对象的属性,比如说从服务器获取它。

此外,这是 开闭原则 的一部分。

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 修饰符保证代码 仅在单个类的边界内修改是危险的(您可以安全地修改并且不会有 叠叠乐效应).

因此,当需要为外部类提供访问权限时,默认情况下使用 privatepublic/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();

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/clean-code-php/...

译文地址:https://learnku.com/docs/clean-code-php/...

上一篇 下一篇
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
贡献者:2
讨论数量: 0
发起讨论 只看当前版本


暂无话题~