【问题标题】:Organizing classes and properties in PHP - the right way?在 PHP 中组织类和属性——正确的方法?
【发布时间】:2018-04-02 11:40:01
【问题描述】:

请帮助我。我需要更好地理解 PHP OOP 原则。

如果我有一个对于所有类实例都不可变的类属性,它应该被定义为静态吗? 如果是这样,有没有办法确保在该类型的所有类中都定义了静态属性?正如我在 PHP 手册中所读到的,静态属性既不能通过接口控制,也不能通过抽象类控制?还是我错了?

简单的例子。

<?php

// Parent class
abstract class Employee 
{
    abstract public function getAlias();
}

// Child classes
class Manager extends Employee 
{

    public function getAlias()
    {
        return 'manager';
    }
}
class Security extends Employee 
{
    public function getAlias()
    {
        return 'security';
    }   
}

告诉我,alias 属性应该放在哪里? 我必须确保将来创建的任何 Employee 后代都将定义该属性。可以在动态方法中保留这种属性吗?还是应该放在常量、静态方法或静态属性中?

【问题讨论】:

  • 你能解释一下,你打算用这个别名做什么?
  • 例如,alias 属性(就任何类似属性而言)可以存储在 DB 表中并用于单表继承 - 根据检索到的 DB 记录的别名实例化一个适当的类。跨度>
  • 在这种情况下,您可以只使用实际的类名而不是别名。 Manager::class 会给你完全限定的类名。另外,您的 ORM 不应该为您处理吗?不要误会我的意思。这是一个有效的问题。它只是闻起来像是可以或应该通过类型检查来处理的东西。但要决定这需要一些背景。
  • TBH,您的Employee 实例应该只包含业务逻辑或只包含SQL 代码。表名实际上应该通过配置来管理,而不是在类定义中硬编码。

标签: php oop architecture static


【解决方案1】:

实际上,当前版本相当不错(如果考虑没有上下文),因为它使代码更清晰,因为它更接近principle of least astonishment。从技术上讲,您可以将其重写为这样(但这实际上会使情况变得更糟代码):

abstract class Employee {
    public function getAlias() {
        return $this->alias;
    }
}

class Manager extends Employee {
    protected $alias = 'mngr';
}


$user = new Manager;
echo $user->getAlias();

直播代码:https://3v4l.org/sjVOT

更重要的方面是这段代码的目的。你提到过,你会想用这样的东西来处理单表继承,但这里是重要的部分:

你的域实体不应该知道你的持久层是如何工作的

从域层提取结构信息以用于某些查询构建器是一个糟糕的主意。我建议您改为查看data mapper 模式(您可能实际上应该阅读PoEAA 书)。

您的域实体不应知道有关如何(甚至“如果”)保存或恢复它们的任何详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 2018-09-29
    相关资源
    最近更新 更多