【问题标题】:Constructor returning value?构造函数返回值?
【发布时间】:2012-08-07 21:48:28
【问题描述】:

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

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

【问题讨论】:

  • 我不认为构造函数返回对象:我相信 PHP 会实例化给定类的一个新实例,然后在用户可以做任何事情之前调用它的构造函数。
  • 感谢指正。重新阅读我的帖子后,我寻找评论来准确说出您发布的内容:)

标签: php constructor return


【解决方案1】:

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

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

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

$obj->__construct();

这将允许您使用构造函数的返回值。但是,这种情况极少见,完全不推荐。

【讨论】:

  • 实际上,技术上这是可能的:codepad.org/sh94ogi9 - 你只需要直接调用函数,而不是通过new。这要求对象已经自然存在。
  • @hakra:是的,但是 OP 询问了构造函数的意义,即创建新对象。不过,我会将其添加到答案中。
  • 技术上可能接近 nitpickydidodida,我只是想插话,回答太晚了。 :)
  • 然后显示我应该在 php 构造函数中声明 null 返回类型#phpstan
【解决方案2】:

到目前为止给出的答案是不正确的。你可以对构造函数的返回值做任何你想做的事情,所以“对构造函数的返回值无能为力(除了使用它创建的对象)”是不正确的。构造函数的返回值不是“它”创建的对象。构造函数不会创建对象(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 的唯一原因是父类不是抽象的,但它本身可以被实例化——但在这种情况下,将永远不会看到返回的错误消息。所以,不好的模式;坏的。构造函数不打算返回值,这意味着您正在利用这种机制打开一个结构上的蠕虫罐。

【讨论】:

    【解决方案3】:

    查看此网址 - 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
    }
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        实际上会起作用,并且您确实会获得返回值。这显然是一种丑陋的做事方式。

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

        【讨论】:

          【解决方案6】:

          如果您总是期望一个字符串作为返回值,您可以添加方法__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;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-10-21
            • 2013-10-03
            • 2016-09-24
            • 2011-10-14
            • 1970-01-01
            相关资源
            最近更新 更多