Warum kann ich das in PHP nicht tun?
class C
{
function foo() {}
}
new C()->foo();
aber ich muss es tun:
$v = new C();
$v->foo();
In allen Sprachen kann ich das tun...
Warum kann ich das in PHP nicht tun?
class C
{
function foo() {}
}
new C()->foo();
aber ich muss es tun:
$v = new C();
$v->foo();
In allen Sprachen kann ich das tun...
Ab PHP 5.4 können Sie Folgendes tun
(new Foo)->bar();
Vorher ist das nicht möglich. Siehe
Aber Sie haben einige Alternativen
Unglaublich hässliche Lösung, die ich nicht erklären kann:
end($_ = array(new C))->foo();
Sinnloses Serialisieren/Unserialisieren, nur um eine Kette bilden zu können
unserialize(serialize(new C))->foo();
Ebenso sinnloser Ansatz mit Reflection
call_user_func(array(new ReflectionClass('Utils'), 'C'))->foo();
Ein etwas vernünftigerer Ansatz mit Funktionen als Fabrik:
// global function
function Factory($klass) { return new $klass; }
Factory('C')->foo()
// Lambda PHP < 5.3
$Factory = create_function('$klass', 'return new $klass;');
$Factory('C')->foo();
// Lambda PHP > 5.3
$Factory = function($klass) { return new $klass };
$Factory('C')->foo();
Der vernünftigste Ansatz mit Fabrik-Methoden-Muster Lösung:
class C { public static function create() { return new C; } }
C::create()->foo();
In PHP können Sie keine beliebige Methode auf ein frisch erstelltes Objekt wie new Foo()->someMethod();
Tut mir leid, aber so ist es nun einmal.
Aber Sie könnten eine Lösung wie diese finden:
<?php
class CustomConstructor
{
public static function customConstruct($methodName)
{
$obj = new static; //only available in PHP 5.3 or later
call_user_method($methodName, $obj);
return $obj;
}
}
Erweitern Sie CustomContructor auf diese Weise:
class YourClass extends CustomConstructor
{
public function someCoolMethod()
{
//cool stuff
}
}
Und instanziieren Sie sie wie folgt:
$foo = YourClass::customConstruct('someCoolMethod');
Ich habe es nicht getestet, aber so oder so ähnlich sollte es funktionieren.
Berichtigung: Dies funktioniert nur in PHP 5.3 und höher, da eine späte statische Bindung erforderlich ist.
Sie sollten nicht in der Lage sein, Code auszuführen wie
new C()->foo();
in anderen Sprachen, zumindest nicht, solange diese Sprache der Logik genau folgt. Das Objekt wird nicht nur mit C()
sondern mit der vollen new C()
. Daher sollten Sie hypothetisch in der Lage sein, diesen Code auszuführen, wenn Sie ein weiteres Paar Klammern einfügen: (new C())->foo();
(Seien Sie gewarnt: Ich habe das nicht getestet, ich sage es nur. sollte hypothetisch funktionieren.)
Die meisten Sprachen (die ich kenne) gehen mit dieser Situation auf die gleiche Weise um. C, C#, Java, Delphi...
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.