2017-10-21 168 views
-1

请帮帮我。我需要更好地理解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属性应该放在哪里? 我必须确定将来创建的任何员工后代都将定义该属性。在动态方法中保留这种属性可以吗?或者他们应该被放置在常量,静态方法或静态属性?

+0

你能解释一下,你打算使用别名是什么? – Gordon

+0

例如,可以在数据库表中存储'alias'属性(与其他任何相似的属性一样),并用于单表继承 - 根据检索到的DB记录的别名实例化适当的类。 – Roman

+0

你可以在这种情况下使用实际的类名而不是别名。 'Manager :: class'会给你完全合格的类名称。另外,您的ORM不应该为您处理?不要误解我的意思。这是一个有效的问题。它只是闻起来可能或应该通过类型检查来处理。但是要决定这需要一些背景。 – Gordon

回答

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(); 

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

更重要的方面是这个代码的目的。你所提到的,你会想使用这样的处理单表继承,但这里是重要的部分:

你的域实体不应该知道你的持久层的工作原理

并从某些查询生成器中使用的域层拉结构信息是一个可怕的想法。我建议你,而不是着眼于data mapper模式(你应该真正阅读的书PoEAA)。

你的域实体不应该知道他们是如何(或者甚至是“如果”)被保存或恢复任何细节。