请帮帮我。我需要更好地理解PHP OOP原则。
如果我有一个对所有类实例都不可变的类属性,那么应该将它定义为static? 如果是这样,有没有办法确保在该类型的所有类中定义静态属性?正如我在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后代都将定义该属性。在动态方法中保留这种属性是否可以?或者它们应该放在常量,静态方法或静态属性中?
答案 0 :(得分:0)
实际上当前版本相当不错(如果没有上下文的考虑),因为它使代码更清晰,因为它更贴近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();
更重要的方面是此代码的目的。你提到过,你会想要使用这样的东西来处理单表继承,但这里是重要的部分:
您的域实体不应该知道您的持久层如何工作。
从域层提取结构信息以供在某些查询构建器中使用是一个糟糕的主意。我建议您改为查看data mapper模式(您可能应该阅读PoEAA书)。
您的域名实体不应该知道有关如何(甚至&#34; if&#34;)保存或恢复这些内容的任何详细信息。