构造函数返回值?

时间:2012-08-10 14:55:56

标签: php constructor return

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

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

6 个答案:

答案 0 :(得分:41)

确实你是对的。使用构造函数的返回值无法做任何事情(除了使用它创建的Object)。

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

如果直接调用函数

,在技术上可以使用构造函数的返回值
$obj->__construct();

这将允许您使用构造函数的返回值。但是,这种情况非常罕见,而且不推荐使用。

答案 1 :(得分:13)

到目前为止给出的答案是不正确的。你可以用构造函数的返回值做任何你想做的事情,所以“使用构造函数的返回值(除了使用它创建的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. 在父构造函数中设置指示发生错误的属性,然后在派生构造函数中检查这些属性的状态。
  3. 如果父构造函数中的错误不是例外,他可能决定让父构造函数返回错误值,而不是将瞬态错误信息存储为对象属性。当然,然后命名父方法__construct的唯一原因是,如果父类不是抽象的,但它本身可以实例化 - 但在该上下文中,永远不会看到返回的错误消息。所以,糟糕的模式;坏。构造函数不是为了返回值,这意味着您可以通过利用此机制打开蠕虫的架构。

答案 2 :(得分:4)

请参阅此网址 - Returning a value in constructor function of a class

阅读: -

构造函数不会获得返回值;它们完全用于实例化课程。

如果不重组你已经在做的事情,你可以考虑在这里使用例外。

public function __construct ($identifier = NULL)
{
  $this->emailAddress = $identifier;
  $this->loadUser();
}

private function loadUser ()
{
    // try to load the user
    if (/* not able to load user */) {
        throw new Exception('Unable to load user using identifier: ' . $this->identifier);
    }
}

现在,您可以这种方式创建新用户。

try {
    $user = new User('user@example.com');
} catch (Exception $e) {
    // unable to create the user using that id, handle the exception
}

答案 3 :(得分:1)

构造函数不返回任何内容,但您可以从中返回(由于某种原因停止方法执行,但可以创建对象)。

答案 4 :(得分:0)

与其他语言不同,在PHP中,您可以显式调用构造函数。这只是另一个功能。看起来原作者首先决定在构造函数中放置一些可能失败的代码,然后意识到他需要一种方法在失败后重新运行初始化。

$result = $user->__construct($username, $password)

实际上会工作,你确实得到了返回值。这显然是一种丑陋的做事方式。

在我看来,让代码在构造函数中触发副作用并不是一个好习惯。我会将代码放在一个单独的函数中,其名称可以清楚地说明它的作用。

答案 5 :(得分:0)

如果您一直期望将字符串作为返回值,则可以添加方法__toString(),然后,如果尝试打印该类,它将仅返回放置在其中的字符串,而我可以看到这是您的情况,所以我认为这应该对您有用。

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

public function __toString(){
     return $this->modeHash;   
}

...
echo yourClass($username, $password); // will return yourClass->modeHash;