用于在临时对象上调用方法的PHP语法

时间:2010-02-07 17:54:25

标签: php object oop temporary

有没有办法在临时声明的对象上调用方法而不必强制将第1个对象分配给变量?

见下文:

class Test
{
   private $i = 7;      
   public function get() {return $this->i;}   
}

$temp = new Test();
echo $temp->get(); //ok

echo new Test()->get(); //invalid syntax
echo {new Test()}->get(); //invalid syntax
echo ${new Test()}->get(); //invalid syntax

9 个答案:

答案 0 :(得分:7)

你能做的是

class Test
{
   private $i = 7;      
   public function get() {return $this->i;}

   public static function getNew() { return new self(); }
}

echo Test::getNew()->get();

答案 1 :(得分:7)

当我想要出现这种行为时,我会使用以下解决方法。

我声明了这个函数(在全局范围内):

function take($that) { return $that; }

然后我这样用它:

echo take(new Test())->get();

答案 2 :(得分:4)

为什么不这样做:

class Test
{
   private static $i = 7;      
   public static function get() {return self::$i;}   
}

$value = Test::get();

答案 3 :(得分:3)

不幸的是,你不能这样做。这就是PHP的方式,我很害怕。

答案 4 :(得分:3)

没有。这是PHP解析器的限制。

答案 5 :(得分:1)

不可能,为什么要用这种方式创建一个对象?

对象的要点是封装唯一状态。在您给出的示例中,$i将始终为7,因此创建对象没有意义,然后从中获取$i然后将对象丢失到垃圾收集器,因为没有引用返回$i后的对象。像其他地方所示的静态类对于此目的更有意义。或封闭。

相关主题:

答案 6 :(得分:1)

我经常使用这个方便的小功能

 function make($klass) {
    $_ = func_get_args();
    if(count($_) < 2)
        return new $klass;
    $c = new ReflectionClass($klass);
    return $c->newInstanceArgs(array_slice($_, 1));
 }

使用

make('SomeCLass')->method();

make('SomeClass', arg1, arg2)->foobar();

答案 7 :(得分:1)

这是一个老问题:我只是提供更新的答案。

在所有受支持的PHP版本(自2012年5.4.0开始)中,您可以执行此操作:

(new Test())->get();

请参阅https://secure.php.net/manual/en/migration54.new-features.php(&#34;实例化时的成员访问权限&#34;)。

答案 8 :(得分:0)

最近出现在php-internals上,不幸的是一些有影响力的人(例如狙击手)积极开发PHP oppose the feature。发一封电子邮件到php-internals@lists.php.net,让他们知道你是一个成年程序员。