返回了什么?(实例化时类方法访问)


What is returned? (Class method access on instantiation)

编辑:请注意,由于意识到我问错了问题(忘记了我真正想问的问题),我将原来的问题附加到了实际问题中

在PHP5.4(从RC1开始)中,可以在类实例化时访问类方法。

换句话说,据我所知,现在可以做到:$foo = new bar()->foobar();,它节省了时间和代码行。

对于我的问题,让我们看看下面的例子:

class foo {
    function __construct() {
    }
    function bar() {
        return 'world';
    }
}
$foobar = (new foo())->bar();
echo $foobar;

我的问题是,在这种情况下,当构造函数和初始化时调用的方法都返回值时,最后一行(即echo $foobar;)输出什么?

如果非要我猜测的话,因为我实际上还没有机会玩5.4,所以foo::bar()的返回将覆盖foo::__construct()的回归,因为它是最后返回的。但我只是想检查一下。


好吧,所以上面的问题甚至不符合逻辑(因为__construct()不应该返回)。我真正想问的是:上面例子中的$foobar包含类实例还是$bar的返回?如果是后者,如果类在实例化后将不可用,那么使用它有什么意义?只使用一个静态方法或在自己的行中调用该方法不是更好吗?

首先,您不应该从构造函数返回任何内容。这是一条基本规则。现在,我们中的一些人不遵循这一点,因为他们喜欢事后调用构造函数并接收一些输入而不是什么都不接收的概念。

但在一个好的编程策略的情况下,构造函数应该只通过"new"关键字调用,并且不应该返回任何内容。

是的,在任何情况下,NEW CLASSNAME()都会在所有情况下返回实例化的对象:)

快乐编程。。。

<?php
class myclass {
        public function __construct(){
                return 'hello';
        }
}
$a = new myclass();
var_dump($a);
var_dump($a->__construct());

将输出

object(myclass)#1 (0) { } 
string(5) "hello" 

编辑以下问题更改

我有根据的猜测是$foobar将包含"world",并因此与您的代码相呼应。

同样的事情也发生在其他语言中,比如c#中。您可以直接在内联中实例化一个对象调用一个方法,然后丢失该对象,只为从调用的内联函数中获得返回。

var_dump(new foo()); //Will var_dump the object
var_dump(new foo()->bar()); //Will var_dump "world"

您的示例缺少括号:

$foobar = (new foo())->bar();
echo $foobar; # world

因为__construct()不返回任何内容,所以return语句在构造函数中是无用的。这在PHP 4 IIRC中是可能的,但由于PHP 5 new将始终返回对象。

编辑:

上例中的$foobar是否包含类实例或$[sic!]bar[()]的返回?

返回值(如果修复了括号)。后者也是如此。

如果是后者,如果类在实例化后将不可用,那么使用它有什么意义?

有没有道理在旁观者的眼中。通常情况下,您不能查看类,因此,预计类方法需要该对象。

只使用一个静态方法或在自己的行中调用该方法不是更好吗?

调用静态函数与调用对象方法不同。例如,该方法在静态调用时可能无法工作。

在自己的行上编写方法调用通常被认为是一种好的做法,因为它可读性更好:

$foo = new foo();
echo $foo->bar();