2017-08-02 92 views
0

有沒有在PHP解決方案時普遍認爲,用於創建返回非二進制狀態的功能呢?例如,如果一個函數會返回「成功」或「失敗」,它是簡單的只是回吐一個布爾值,但如果它需要返回失敗與thing_1_happened與thing_2_happened?函數返回非二進制狀態的最優雅方式是什麼?

在過去,我有函數返回匹配常量整數或字符串,如

$result = $myClass->whatever(); 

if ($result === MyClass::Thing1Happened) { 
    ... 
} elseif ($result === MyClass::Thing2Happened) { 
    ... 
} 

但它只是感覺不雅和類落得噸僅由單一功能的常量。我想這是不是回到魔術,不願透露姓名的值更好,這將導致錯字的錯誤(如果你使用的字符串)或降低可讀性(如果你使用的整數),但有沒有更好的辦法?

如果有對「非二進制狀態回報」,這將使谷歌這樣,能夠在正確的說法,請賜教。

+0

在其他編程語言中稱爲'enum'。但由於某種原因,PHP決定在沒有它的情況下可以做到這一點。所以這取決於你。 – spectras

+0

'return $ result;'?? –

回答

1

我建議創建一個新的值對象類來表示狀態。該類可能只需要一個成員變量,state,可能的狀態值可以用常量定義。擁有這樣的對象可以讓你針對你的狀態編寫更復雜的邏輯。這也保持了單個類中包含的狀態表示邏輯,這對測試非常有用,可以防止缺陷等。

class EventStateValueObject 
{ 
    /** 
    * Side note: this has to be declared as protected; if declared as public, the magic getters and setters are bypassed 
    * @var int 
    */ 
    protected $state; 

    /** 
    * @param string $name 
    * @param mixed $value 
    * @return void 
    */ 
    public function __set($name, $value) 
    { 
     throw new RuntimeException('Value objects are immutable'); 
    } 

    /** 
    * @param string $name 
    * @return mixed 
    */ 
    public function __get($name) 
    { 
     return $this->$name; 
    } 

    /** 
    * @param int $state 
    */ 
    public function __construct(int $state) 
    { 
     $this->state = $state; 
    } 
} 
+0

當然,這可以工作。你最終會遇到一些代碼膨脹的問題,因爲每個函數都有一個額外的類,它會以這種方式返回,但它對閱讀和測試很有用。 – ZorroDeLaArena

+0

真,代碼膨脹是一個潛在的問題,但你可以通過抽象的價值對象內部機制(getter和setter的東西)爲特徵這將使具體類小了很多,減少膨脹最小化。 – Kita

相關問題