查看下面的代码,我看到构造函数正在返回一个值。我认为构造函数只返回对象。有人能告诉我我错过了什么吗?
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;
}
}
确实你是对的。构造函数的返回值不能做任何事情(除了使用它创建的对象)。
所以不,你没有遗漏任何东西,而是编写该代码的开发人员。
如果直接调用该函数,从技术上讲可以使用构造函数的返回值
$obj->__construct();
这将允许您使用构造函数的返回值。然而,这种情况非常罕见,而且不推荐。
你可以用构造函数的返回值做任何你想做的事情,所以“不能用构造函数的返回值做任何事(除了使用它创建的对象)”是不正确的。构造函数的返回值不是“它”创建的对象。构造函数不会创建对象(
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()
以外的方法来获取你的值,而你失去的只是默默无闻。我想它可以用作错误处理的一种方式——还有另外两种方法可以完成同样的事情:
如果父构造函数中的错误不是异常,他可能会决定让父构造函数返回错误值,而不是将瞬态错误信息存储为对象属性。当然,将父类方法命名为
__construct
的唯一原因是父类不是抽象的,而是本身可以实例化——但在这种情况下,永远不会看到返回的错误消息。所以,不好的模式;坏的。构造函数并不打算返回值,这意味着您正在利用此机制打开一个架构蠕虫罐。
参见此页:在类的构造函数中返回值
阅读:-
构造函数没有返回值;它们完全用于实例化类。
如果不重组你已经在做的事情,你可以考虑在这里使用例外。
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
}
构造函数不返回任何内容,但您可以从中返回(由于某种原因在某个时刻停止方法执行,但可以创建对象)。
如果您总是期望一个字符串作为返回值,您可以添加方法
__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;
与其他语言不同,在 PHP 中您可以显式调用构造函数。这只是另一个功能。看起来原作者首先决定在构造函数中放置一些可能失败的代码,然后意识到他需要一种在失败后重新运行初始化的方法。
$result = $user->__construct($username, $password)
实际上会起作用并且你确实得到了返回值。显然这是一种丑陋的做事方式。
在我看来,在构造函数中使用触发副作用的代码并不是一个好的做法。我会将代码放在一个单独的函数中,其名称清楚地说明了它的作用。
<?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;
}
}
}
修复错误