2014-03-19 9 views
13

Beim Versuch, dies in PHP zu tun 5.2.9:Inline PHP Klon

$foo = (clone $template)->bar(); 

PHP gibt mir einen Syntaxfehler:

Parser error "';' expected after expression (Found token: ->)" 

Bin ich etwas falsch? Oder gibt es einfach keine Möglichkeit, ein Objekt inline zu klonen, sodass ich meine Anweisung in zwei Zeilen aufteilen müsste?

+1

Ich erinnere mich nicht an Details, aber ältere Versionen von PHP hatten Probleme mit einigen Ausdrücken, die sich auf Objekteigenschaften bezogen. Vielleicht war das einer von ihnen? Können Sie Ihre Version von PHP aktualisieren? – Brad

+2

@Brad Das gleiche Problem mit neueren PHP-Versionen, aber der Fehler ist anders. – Florent

+1

PHP 7 unterstützt jetzt diese https://3v4l.org/D5Vd9 – Petah

Antwort

12

Leider erlaubt PHP diese Syntax (in keiner Version). Als Alternative es in zwei Linien zu brechen, können Sie dies tun:

Added class member access on instantiation (e.g. (new foo)->bar()) support.

+1

Schade, ich dachte PHP hätte diese Seltsamkeiten durch Version 5 überwunden. Ich werde die 'call_user_function'-Version betrachten ;-) –

+0

Ich glaube nicht, dass es da ist jeder andere Weg zu einer Zeile dies. Oder wenn es ist, ich weiß nicht, was es ist :) –

+0

Hier ist zu hoffen, dass dies in PHP 7 hinzugefügt wird. –

0

Dies würde nur von PHP 5.4.0

Lese Changelog verfügbar Um dies zu umgehen, können Sie eine Funktion zum Klonen einer Variablen erstellen:

$clone = function ($value) { 
    return clone $value; 
}; 

$foo = $clone($template); 
+6

Leider funktioniert diese Syntax nur mit 'neu'. Es funktioniert nicht mit "klonen" https://eval.in/123192 :( –

2
class X { 
    public function foo(){ 
     echo 'inline clone'; 
    } 
} 

$x = new X; 

$y = clone $x and $y->foo(); // "inline clone" 
0

As:

$foo = call_user_func(array(clone $template, 'bar'));