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

时间:2012-01-06 20:03:23

标签: php

编辑:请注意,由于我意识到我提出了错误的问题(通过忘记我实际上要问的问题),我将我原来的问题附加到我的实际问题上。

在PHP 5.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的返回值?如果是后者,如果在实例化后该类不可用,它会有什么意义呢?使用静态方法或在自己的行上调用方法不是更好吗?

2 个答案:

答案 0 :(得分:1)

首先,你永远不应该从构造函数返回任何东西。这是一个基本规则。现在我们中的一些人不遵循这个原因,因为他们喜欢之后调用他们的构造函数并接受一些输入而不是一无所有的概念。

但是在良好的编程策略的情况下,构造函数应该只通过“new”关键字调用,不应该返回任何内容。

是的,在所有情况下,NEW CLASSNAME()在所有情况下都返回instanciated对象:)

快乐的节目......

<?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将包含“世界”,因此用你的代码回应它。

在c#等其他语言中也会发生同样的事情。您可以直接内联对象调用方法,并仅丢失对象以从被调用的内联函数返回。

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

答案 1 :(得分:0)

您的示例缺少括号:

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

因为__construct()什么都不返回,所以return语句在构造函数中是无用的。这在PHP 4 IIRC中是可能的,但是因为PHP 5 new将始终返回该对象。

修改

  

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

返回值(如果您修复了括号)。所以后者。

  

如果是后者,如果在实例化后该类不可用,它会有什么意义呢?

有意义与否是在旁观者的眼中。通常你不能查看类,因此,期望一个类方法需要该对象。

  

使用静态方法或在自己的行上调用方法不是更好吗?

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

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

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