有没有办法在临时声明的对象上调用方法而不必强制将第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
答案 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,让他们知道你是一个成年程序员。