Yang ingin saya lakukan adalah sesuatu seperti ini:
$method_result = new Obj()->method();
Alih-alih harus melakukan:
$obj = new Obj();
$method_result = $obj->method();
Hasilnya sebenarnya tidak penting bagi saya dalam kasus khusus saya. Tetapi, adakah cara untuk melakukan ini?
my_method
harus diumumkanstatic
.Jawaban:
Fitur yang Anda minta tersedia dari PHP 5.4. Berikut adalah daftar fitur baru di PHP 5.4:
http://php.net/manual/en/migration54.new-features.php
Dan bagian yang relevan dari daftar fitur baru:
sumber
(new Foo)->property
jika Anda mau.(new Foo)->property
- nilai yang Anda simpan tidak memiliki tempat lain karena objek tidak akan ada lagi setelah itu karena tidak disimpan di mana pun.return $this
seter Anda. Ini juga akan memungkinkan Anda untuk rantai setter.Anda tidak dapat melakukan apa yang Anda minta; tetapi Anda dapat "menipu", menggunakan fakta bahwa, di PHP, Anda dapat memiliki fungsi yang memiliki nama yang sama dengan kelas; nama-nama itu tidak akan bertentangan.
Jadi, jika Anda mendeklarasikan kelas seperti ini:
Anda kemudian dapat mendeklarasikan fungsi yang mengembalikan instance kelas itu - dan memiliki nama yang persis sama dengan kelas:
Dan sekarang, menjadi mungkin untuk menggunakan satu-liner, seperti yang Anda minta - satu-satunya hal yang Anda panggil fungsi, sehingga tidak menggunakan yang baru:
Dan itu bekerja: ini, saya mendapatkan:
sebagai output.
Dan, lebih baik, Anda dapat menempatkan beberapa phpdoc pada fungsi Anda:
Dengan cara ini, Anda bahkan akan memiliki petunjuk dalam IDE Anda - setidaknya, dengan Eclipse PDT 2.x; lihat screeshot:
Sunting 2010-11-30: Sekadar informasi, RFC baru telah dikirimkan, beberapa hari yang lalu, yang mengusulkan untuk menambahkan fitur ini ke salah satu versi PHP yang akan datang.
Lihat: Permintaan Komentar: Mesin virtual dan panggilan metode / akses properti
Jadi, mungkin melakukan hal-hal seperti ini dimungkinkan di PHP 5.4 atau versi lain di masa depan:
sumber
Anda dapat melakukannya secara lebih universal dengan mendefinisikan fungsi identitas:
Dengan begitu Anda tidak perlu mendefinisikan fungsi untuk setiap kelas.
sumber
Bagaimana tentang:
: P
sumber
Tidak, ini tidak mungkin.
Anda perlu menetapkan turunan ke variabel sebelum Anda dapat memanggil metode apa pun itu.
Jika Anda benar-benar tidak ingin melakukan ini, Anda dapat menggunakan pabrik seperti yang disarankan ropstah:
sumber
public static function
bukanpublic function
. Dianjurkan untuk menggunakan statis?Anda bisa menggunakan metode pabrik statis untuk menghasilkan objek:
sumber
Saya juga sedang mencari satu-liner untuk menyelesaikan ini sebagai bagian dari ekspresi tunggal untuk mengubah tanggal dari satu format ke format lainnya. Saya suka melakukan ini dalam satu baris kode karena ini adalah operasi logis tunggal. Jadi, ini sedikit samar, tetapi ini memungkinkan Anda membuat instance dan menggunakan objek tanggal dalam satu baris:
Cara lain untuk mengubah konversi string tanggal dari satu format ke format lainnya adalah menggunakan fungsi helper untuk mengelola bagian kode OO:
Saya pikir pendekatan berorientasi objek itu keren dan perlu, tetapi kadang-kadang bisa membosankan, membutuhkan terlalu banyak langkah untuk menyelesaikan operasi sederhana.
sumber
Saya melihat ini sudah cukup lama sebagai pertanyaan pergi tapi di sini ada sesuatu yang saya pikir harus disebutkan:
Metode kelas khusus yang disebut "__call ()" dapat digunakan untuk membuat item baru di dalam kelas. Anda menggunakannya seperti ini:
Output harus:
Dengan demikian, Anda dapat membodohi PHP untuk membuat perintah "baru" di dalam kelas tingkat atas Anda (atau kelas mana pun juga) dan memasukkan perintah sertakan Anda ke fungsi __call () untuk memasukkan kelas yang telah Anda minta. Tentu saja, Anda mungkin ingin menguji $ func untuk memastikan itu adalah perintah "baru" yang dikirim ke perintah __call () dan (tentu saja) Anda dapat memiliki perintah lain juga karena cara __call () bekerja.
sumber
Cukup kita bisa melakukan ini
sumber