构造函数返回值?

问题描述 投票:0回答:7

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

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 constructor return
7个回答
64
投票

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

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

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

$obj->__construct();

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


28
投票

你可以用构造函数的返回值做任何你想做的事情,所以“不能用构造函数的返回值做任何事(除了使用它创建的对象)”是不正确的。构造函数的返回值不是“它”创建的对象。构造函数不会创建对象(

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
的唯一原因是父类不是抽象的,而是本身可以实例化——但在这种情况下,永远不会看到返回的错误消息。所以,不好的模式;坏的。构造函数并不打算返回值,这意味着您正在利用此机制打开一个架构蠕虫罐。


5
投票

参见此页:在类的构造函数中返回值

阅读:-

构造函数没有返回值;它们完全用于实例化类。

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

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('[email protected]');
} catch (Exception $e) {
    // unable to create the user using that id, handle the exception
}

4
投票

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


3
投票

如果您总是期望一个字符串作为返回值,您可以添加方法

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

2
投票

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

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

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

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


0
投票
<?php

// php cart class
class Cart
{
    public $db = null;

    public function __construct(DBController $db)
    {
        if (!isset($db->con)) return null;
        $this->db = $db;
    }

    // insert into cart table
    public  function insertIntoCart($params = null, $table = "cart"){
        if ($this->db->con != null){
            if ($params != null){
                // "Insert into cart(user_id) values (0)"
                // get table columns
                $columns = implode(',', array_keys($params));

                $values = implode(',' , array_values($params));

                // create sql query
                $query_string = sprintf("INSERT INTO %s(%s) VALUES(%s)", $table, $columns, $values);

                // execute query
                $result = $this->db->con->query($query_string);
                return $result;
            }
        }
    }

    // to get user_id and item_id and insert into cart table
    public  function addToCart($userid, $itemid){
        if (isset($userid) && isset($itemid)){
            $params = array(
                "user_id" => $userid,
                "item_id" => $itemid
            );

            // insert data into cart
            $result = $this->insertIntoCart($params);
            if ($result){
                // Reload Page
                header("Location: " . $_SERVER['PHP_SELF']);
            }
        }
    }

    // delete cart item using cart item id
    public function deleteCart($item_id = null, $table = 'cart'){
        if($item_id != null){
            $result = $this->db->con->query("DELETE FROM {$table} WHERE item_id={$item_id}");
            if($result){
                header("Location:" . $_SERVER['PHP_SELF']);
            }
            return $result;
        }
    }

    // calculate sub total
    public function getSum($arr){
        if(isset($arr)){
            $sum = 0;
            foreach ($arr as $item){
                $sum += floatval($item[0]);
            }
            return sprintf('%.2f' , $sum);
        }
    }

    // get item_it of shopping cart list
    public function getCartId($cartArray = null, $key = "item_id"){
        if ($cartArray != null){
            $cart_id = array_map(function ($value) use($key){
                return $value[$key];
            }, $cartArray);
            return $cart_id;
        }
    }

    // Save for later
    public function saveForLater($item_id = null, $saveTable = "wishlist", $fromTable = "cart"){
        if ($item_id != null){
            $query = "INSERT INTO {$saveTable} SELECT * FROM {$fromTable} WHERE item_id={$item_id};";
            $query .= "DELETE FROM {$fromTable} WHERE item_id={$item_id};";

            // execute multiple query
            $result = $this->db->con->multi_query($query);

            if($result){
                header("Location :" . $_SERVER['PHP_SELF']);
            }
            return $result;
        }
    }


} 

修复错误

© www.soinside.com 2019 - 2024. All rights reserved.