4 Stimmen

Aufruf einer Methode eines Objekts bei der Instanzerstellung

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...

16voto

Gordon Punkte 304254

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();

8voto

Pablo Punkte 1053

Ab PHP 5.4 können Sie das tun: (new Foo())->someMethod();

4voto

selfawaresoup Punkte 14863

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.

1voto

JMTyler Punkte 1594

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...

-1voto

pinaki Punkte 5163

Ich habe dies versucht und war erfolgreich -

<?php

$obj = new test("testFunc");

class test{
    function __construct($funcName){
        if(method_exists($this, $funcName)){
            self::$funcName();
        }
    }

    function testFunc(){
        echo "blah";
        return $this;
    }
}

?>

CodeJaeger.com

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.

Powered by:

X