2017-08-02 95 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

相关问题