2017-10-21 162 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)。

你的域實體不應該知道他們是如何(或者甚至是「如果」)被保存或恢復任何細節。