构造函数返回值?

新手上路,请多包涵

查看以下代码,我看到构造函数正在返回一个值。我认为构造函数只返回对象。有人可以告诉我我错过了什么吗?

 public function __construct($username = null, $password = null){
        $urlLogin = "{$this->apiHost}/login/$username";

        $postData = sprintf("api_type=json&user=%s&passwd=%s",
                            $username,
                            $password);
        $response = $this->runCurl($urlLogin, $postData);

        if (count($response->json->errors) > 0){
            return "login error";
        } else {
            $this->modHash = $response->json->data->modhash;
            $this->session = $response->json->data->cookie;
            return $this->modHash;
        }
    }

原文由 Nate 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 824
2 个回答

确实你是对的。构造函数的返回值无能为力(除了使用它创建的对象)。

所以不,你没有遗漏任何东西,是编写该代码的开发人员是谁。

如果直接调用函数,从技术上讲可以使用构造函数的返回值

$obj->__construct();

这将允许您使用构造函数的返回值。然而,这是非常不常见的,相当不推荐。

原文由 Madara‘s Ghost 发布,翻译遵循 CC BY-SA 3.0 许可协议

你可以用构造函数的返回值做任何你想做的事,所以“没有什么可以用构造函数的返回值做(除了使用它创建的对象)”是不正确的。构造函数的返回值不是“它”创建的对象。构造函数不创建对象( new 关键字创建)。构造函数的返回值与任何其他函数的返回值相同:无论您选择返回什么。此外,一个对象必须已经存在才能调用其构造函数的说法也是错误的。这是完全有效的:

 $parent_constructor_return_value = parent::__construct();

例如:

 abstract class MyBase {
    function __construct () {
        return "Hello, world.";
    }
}
class MyDerived extends MyBase {
    function __construct () {
        echo parent::__construct();
    }
}
new MyDerived(); // prints "Hello, world."

虽然这是可能的,但我无法想象最佳实践的场景。毕竟,您总是可以调用 parent::__construct() 以外的方法来获取您的价值,而您失去的只是默默无闻。我想它可以用作错误处理的一种方式——还有两种其他方式可以完成同样的事情:

  1. 在父构造函数中抛出异常并在派生构造函数中捕获它们。
  2. 在父构造函数中设置属性以指示发生错误,然后在派生构造函数中检查这些属性的状态。

如果父构造函数中的错误不是异常的,他可能已经决定让父构造函数返回错误值,而不是将瞬态错误信息存储为对象属性。当然,命名父类的方法 __construct 的唯一原因是父类不是抽象的但本身可以被实例化——但在这种情况下,返回的错误消息将永远不会被看到。所以,坏模式;坏的。构造函数不打算返回值,这意味着您正在通过利用此机制打开一个架构蠕虫罐头。

原文由 Vladimir Kornea 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏