Was ich gerne machen würde, ist ungefähr so:
$method_result = new Obj()->method();
Anstatt zu tun:
$obj = new Obj();
$method_result = $obj->method();
Das Ergebnis ist mir in meinem speziellen Fall eigentlich egal. Aber gibt es eine Möglichkeit, dies zu tun?
my_method
stattdessen deklariert werden solltestatic
.Antworten:
Die von Ihnen angeforderte Funktion ist in PHP 5.4 verfügbar. Hier ist die Liste der neuen Funktionen in PHP 5.4:
http://php.net/manual/en/migration54.new-features.php
Und der relevante Teil aus der Liste der neuen Funktionen:
quelle
(new Foo)->property
wenn Sie möchten.(new Foo)->property
- der Wert, den Sie speichern, kann nirgendwo hingehen, da das Objekt danach nicht mehr existiert, da es nirgendwo gespeichert wird.return $this
Ihre Setter hinzufügen . Auf diese Weise können Sie auch Setter verketten.Sie können nicht tun, was Sie verlangen; Sie können jedoch "betrügen", indem Sie in PHP eine Funktion verwenden, die denselben Namen wie eine Klasse hat. Diese Namen werden nicht in Konflikt geraten.
Wenn Sie also eine Klasse wie diese deklariert haben:
Sie können dann eine Funktion deklarieren, die eine Instanz dieser Klasse zurückgibt - und genau denselben Namen wie die Klasse hat:
Und jetzt wird es möglich, einen Einzeiler zu verwenden, wie Sie gefragt haben - nur rufen Sie die Funktion auf und verwenden daher nicht new:
Und es funktioniert: hier bekomme ich:
als Ausgabe.
Und besser, Sie können Ihre Funktion mit Phpdoc versehen:
Auf diese Weise haben Sie sogar Hinweise in Ihrer IDE - zumindest mit Eclipse PDT 2.x; siehe den Screeshot:
Bearbeiten 30.11.2010: Nur zur Information wurde vor einigen Tagen ein neuer RFC eingereicht, der vorschlägt, diese Funktion einer der zukünftigen Versionen von PHP hinzuzufügen.
Siehe: Anforderung von Kommentaren: Instanz- und Methodenaufruf / Eigenschaftszugriff
Vielleicht ist es in PHP 5.4 oder einer anderen zukünftigen Version möglich, solche Dinge zu tun:
quelle
Sie können dies universeller tun, indem Sie eine Identitätsfunktion definieren:
Auf diese Weise müssen Sie nicht für jede Klasse eine Funktion definieren.
quelle
Wie wäre es mit:
: P.
quelle
Nein das ist nicht möglich.
Sie müssen die Instanz einer Variablen zuweisen, bevor Sie eine ihrer Methoden aufrufen können.
Wenn Sie dies wirklich nicht tun möchten, können Sie eine Fabrik nutzen, wie Ropstah vorschlägt:
quelle
public static function
statt zu verwendenpublic function
. Wird empfohlen, statisch zu verwenden?Sie können eine statische Factory-Methode verwenden, um das Objekt zu erstellen:
quelle
Auch ich suchte nach einem Einzeiler, um dies als Teil eines einzelnen Ausdrucks zum Konvertieren von Daten von einem Format in ein anderes zu erreichen. Ich mache das gerne in einer einzigen Codezeile, weil es eine einzige logische Operation ist. Dies ist also ein wenig kryptisch, aber Sie können ein Datumsobjekt innerhalb einer einzelnen Zeile instanziieren und verwenden:
Eine andere Möglichkeit, die Konvertierung von Datumszeichenfolgen von einem Format in ein anderes einzeilig durchzuführen, besteht in der Verwendung einer Hilfsfunktion zum Verwalten der OO-Teile des Codes:
Ich denke, der objektorientierte Ansatz ist cool und notwendig, aber manchmal kann er langwierig sein und zu viele Schritte erfordern, um einfache Operationen durchzuführen.
quelle
Ich sehe, dass dies in Bezug auf Fragen ziemlich alt ist, aber hier ist etwas, von dem ich denke, dass es erwähnt werden sollte:
Mit der speziellen Klassenmethode "__call ()" können neue Elemente innerhalb einer Klasse erstellt werden. Sie verwenden es so:
Die Ausgabe sollte sein:
Auf diese Weise können Sie PHP dazu verleiten, einen "neuen" Befehl innerhalb Ihrer Klasse der obersten Ebene (oder einer beliebigen Klasse) zu erstellen, und Ihren Befehl include in die Funktion __call () einfügen, um die von Ihnen angeforderte Klasse einzuschließen. Natürlich möchten Sie wahrscheinlich $ func testen, um sicherzustellen, dass es sich um einen "neuen" Befehl handelt, der an den Befehl __call () gesendet wurde, und (natürlich) Sie könnten auch andere Befehle haben, weil __call () funktioniert.
quelle
Wir können das einfach tun
quelle