在PHP中组织类和属性 - 正确的方法?
问题描述:
请帮帮我。我需要更好地理解PHP OOP原则。在PHP中组织类和属性 - 正确的方法?
如果我有一个类属性,它是不可变的所有它应该被定义为静态的类实例? 如果是这样,有没有办法确保静态属性在所有类型的类中定义?正如我在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
属性应该放在哪里? 我必须确定将来创建的任何员工后代都将定义该属性。在动态方法中保留这种属性可以吗?或者他们应该被放置在常量,静态方法或静态属性?
答
其实目前的版本是很确定(如果不加以考虑),因为它使一个更干净的代码,因为它更接近比赛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)。
你的域实体不应该知道他们是如何(或者甚至是“如果”)被保存或恢复任何细节。
你能解释一下,你打算使用别名是什么? – Gordon
例如,可以在数据库表中存储'alias'属性(与其他任何相似的属性一样),并用于单表继承 - 根据检索到的DB记录的别名实例化适当的类。 – Roman
你可以在这种情况下使用实际的类名而不是别名。 'Manager :: class'会给你完全合格的类名称。另外,您的ORM不应该为您处理?不要误解我的意思。这是一个有效的问题。它只是闻起来可能或应该通过类型检查来处理。但是要决定这需要一些背景。 – Gordon