查看以下代码,我看到构造函数正在返回一个值。我认为构造函数只返回对象。有人能告诉我我错过了什么吗?
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;
}
}
答案 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()
以外的方法来获取你的价值,而你所失去的只是默默无闻。我想它可以用作一种错误处理方式 - 还有另外两种方法可以完成同样的事情:
如果父构造函数中的错误不是例外,他可能决定让父构造函数返回错误值,而不是将瞬态错误信息存储为对象属性。当然,然后命名父方法__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;