构造函数返回值?

2022-08-30 13:32:39

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

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;
        }
    }

答案 1

的确,你是对的。对于构造函数的返回值,什么都做不了(除了使用它创建的对象)。

所以,不,你没有错过任何东西,而是编写该代码的开发人员。

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

$obj->__construct();

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


答案 2

你可以对构造函数的返回值做任何你想做的事情,所以“除了使用它创建的Object之外,不能用构造函数的返回值做任何事情”是不正确的。构造函数的返回值不是创建的对象“it”。构造函数不创建对象(关键字创建对象)。构造函数的返回值与任何其他函数的返回值相同:无论您选择返回什么。此外,对象必须已经存在才能调用其构造函数,这也是错误的。这是完全有效的: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


推荐