用PHP组织类和属性-正确的方法?

用PHP组织类和属性-正确的方法?,php,oop,architecture,static,Php,Oop,Architecture,Static,请帮帮我。我需要更好地理解PHP OOP原则 如果我有一个类属性,它对于所有的类实例都是不可变的,那么它应该被定义为静态的吗? 如果是这样,有没有办法确保在该类型的所有类中都定义了静态属性?正如我在PHP手册中所读到的,静态属性既不能由接口也不能由抽象类控制?还是我错了 简单的例子 <?php // Parent class abstract class Employee { abstract public function getAlias(); } // Child cl

请帮帮我。我需要更好地理解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
属性(就任何类似的属性而言)可以存储在DB table中并用于单表继承-根据检索到的DB记录的别名实例化适当的类。在这种情况下,您可以使用实际的类名而不是别名<代码>管理器::class
将为您提供完全限定的类名。还有,你的ORM不应该帮你处理吗?别误会我。这是一个合理的问题。它闻起来就像是可以或者应该通过类型检查来处理的东西。但要确定是否需要一些context.TBH,您的
Employee
实例应该只包含业务逻辑或只包含SQL代码。表名实际上应该通过配置来管理,而不是在类定义中硬编码。
abstract class Employee {
    public function getAlias() {
        return $this->alias;
    }
}

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


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