在类__construct()中间返回是否可以接受

时间:2012-10-12 21:46:35

标签: php oop constructor

我知道有很多问题与此有关。但是,我没有设法找到简单问题的答案(我不是要求从构造函数返回值,我认为我理解构造函数应返回)。

是否有理由避免在return

中使用__construct

或者这是完全可以接受的编码风格,由于return

,将来不会破坏
class A {
    protected $tristate = null;
    function __construct() {
        // Constructor returns instance of class automatically
        // no need to `return $this`
    }
    protected function Logic() {
        return rand(0, 1) === 1;
    }
}

class B extends A {
    function __construct() {
        parent::__construct();
        if ($this->Logic()) return;
        $this->tristate = true;
    }
}

上面的一个已经过测试,它按预期工作(在我的开发环境中),它将父$tristate var 50/50设置为NULL / TRUE,但是它将来会工作吗?使用void return在构造函数的中间返回时会出现任何问题。

我想到的另一件事是我应该使用return $this而不是普通的return,这通常是无效的,但PHP似乎仍然返回实例,回答可能是return $this和普通return同样出色。

3 个答案:

答案 0 :(得分:3)

对此没有任何影响,我认为不会有任何后果。您可以随时从构造函数返回任何内容。返回值(如果有)将被忽略。

答案 1 :(得分:2)

来自doc

  

构造   void __construct([mixed $ args [,$ ...]])

pseudo type definition

  

void作为返回类型意味着返回值无用。

所以你可以返回任何东西......但它是useless。在你的情况下,return适用于退出函数执行:它只是允许的。

另一个问题是,这是好事还是坏事......

我认为简单的return ;是保存一些IF语句和烦人缩进的好习惯。 有价值的回报(即return false;),如果它没用,是一种不好的做法,因为没有意义。

答案 2 :(得分:0)

确保没有方法return早期是一个很好的经验法则 - 除了其他任何东西之外,它意味着在6个月的时间里,当你回到那条1500线时你知道你不应该写的功能,但无论如何都要做到这一点,你有一个稍微不那么噩梦般的时间来理解愚蠢的事情是如何工作的那样:)

通过使用否定的逻辑检查 - if ( ! $this->Logic() ),您可以获得与早期返回相同的效果,但是您现在可以回到代码中,知道它永远不会在其中间的某个地方随机丢弃您的方法

当然,除了小声说“我知道我不应该”之外,没有什么可以阻止你这样做,但还有另一个声音说“哦,继续,它会好的,你会记住的!”。不要听第二个声音,只是正确地做:P


快速更新要明确 - 没有技术原因可以避免构造函数returnnew关键字强制它返回对象,并覆盖构造函数返回的内容),有一个很好的逻辑理由不这样做。