3

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

有什么理由避免使用returnwithin__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变量 50/50 设置为 NULL/TRUE,但它会在将来工作,并且在构造函数的中间返回时是否会出现任何问题void return

想到的另一件事是我是否应该使用通常是无效return $this的 plainreturn但 PHP 似乎无论如何都会返回实例,答案很可能是两者return $this和 plainreturn一样好。

4

3 回答 3

3

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

于 2012-10-12T21:52:57.980 回答
2

来自文档

构造函数 void __construct ([ 混合 $args [, $... ]] )

并来自 伪类型定义

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

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

另一个问题是这是一个好还是坏的做法......

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

于 2012-10-12T22:03:20.113 回答
0

这是一个很好的经验法则,以确保没有任何方法return是早期的 - 除了其他任何事情之外,这意味着在 6 个月的时间内,当你回到那个 1500 行的函数时,你知道你真的不应该写,但确实做到了无论如何,你有一个稍微不那么噩梦的时间来理解这件愚蠢的事情是如何运作的:)

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

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


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

于 2012-10-12T21:53:41.860 回答