Saya harus bisa memanggil fungsi, tetapi nama fungsi disimpan dalam variabel, apakah ini mungkin? misalnya:
function foo () { // kode di sini } bilah fungsi () { // kode di sini } $ functionName = "foo"; // saya perlu memanggil fungsi berdasarkan apa yang $ functionName
php
dynamic-function
Kadal
sumber
sumber
is_callable
fungsi ini. Ini akan memeriksa apakah variabel berisi sesuatu yang dapat disebut sebagai fungsi (baik itu nama fungsi, array yang berisi instance objek dan nama fungsi, atau fungsi / penutupan anonim)call_user_func(array('ClassName', 'method'), $args)
Versi favorit saya adalah versi inline:
Anda dapat menempatkan variabel atau ekspresi di dalam tanda kurung juga!
sumber
{"functionName"}();
tidak sah dan akan menimbulkan kesalahan sintaksis.Ya, itu mungkin:
Sumber: http://www.onlamp.com/pub/a/php/2001/05/17/php_foundations.html?page=2
sumber
Seperti yang telah disebutkan, ada beberapa cara untuk mencapai ini dengan kemungkinan metode teraman
call_user_func()
atau jika Anda harus, Anda juga dapat menempuh jalan$function_name()
. Dimungkinkan untuk memberikan argumen menggunakan kedua metode ini seperti ituJika fungsi yang Anda panggil milik objek Anda masih dapat menggunakan salah satu dari ini
Namun jika Anda akan menggunakan
$function_name()
metode ini mungkin ide yang baik untuk menguji keberadaan fungsi jika namanya dinamissumber
Jika ada orang lain yang dibawa ke sini oleh google karena mereka mencoba menggunakan variabel untuk metode di dalam kelas, di bawah ini adalah contoh kode yang benar-benar akan berfungsi. Tidak satu pun di atas yang berfungsi untuk situasi saya. Perbedaan utama adalah
&
dalam deklarasi$c = & new...
dan&$c
disahkancall_user_func
.Kasus spesifik saya adalah ketika menerapkan kode seseorang yang berkaitan dengan warna dan dua metode anggota
lighten()
dandarken()
dari kelas csscolor.php. Untuk alasan apa pun, saya ingin memiliki kode yang sama dapat memanggil terang atau gelap daripada memilihnya dengan logika. Ini mungkin hasil dari kekeraskepalaan saya untuk tidak hanya menggunakan if-else atau mengubah kode yang memanggil metode ini.Perhatikan bahwa mencoba apa pun dengan
$c->{...}
tidak berhasil. Setelah membaca konten yang disumbangkan pembaca di bagian bawah halaman php.netcall_user_func
, saya dapat menyatukannya di atas. Perhatikan juga bahwa$params
sebagai array tidak berfungsi untuk saya:Upaya di atas akan memberikan peringatan tentang metode yang mengharapkan argumen ke-2 (persen).
sumber
Beberapa tahun terlambat, tetapi ini adalah cara terbaik sekarang imho:
sumber
Demi kelengkapan, Anda juga dapat menggunakan eval () :
Namun,
call_user_func()
itu cara yang tepat.sumber
eval
bukan solusi untuk pertanyaan ini.Solusi: Gunakan PHP7
Catatan: Untuk versi yang diringkas, lihat TL; DR di akhir jawaban.
Metode Lama
Pembaruan : Salah satu metode lama yang dijelaskan di sini telah dihapus. Lihat jawaban lain untuk penjelasan tentang metode lain, itu tidak dibahas di sini. Ngomong-ngomong, jika jawaban ini tidak membantu Anda, Anda harus kembali memperbarui barang-barang Anda. Dukungan PHP 5.6 telah berakhir pada Januari 2019 (sekarang bahkan PHP 7.0 dan 7.1 tidak didukung). Lihat versi yang didukung untuk informasi lebih lanjut.
Seperti yang disebutkan lainnya, dalam PHP5 (dan juga dalam versi yang lebih baru seperti PHP7) kita bisa menggunakan variabel sebagai nama fungsi, menggunakan
call_user_func()
dancall_user_func_array()
(yang, secara pribadi, saya benci fungsi-fungsi itu), dll.Metode Baru
Pada PHP7, ada cara baru yang diperkenalkan:
Catatan: Segala sesuatu di dalam
<something>
tanda kurung berarti satu atau lebih ekspresi untuk membentuk sesuatu, misalnya<function_name>
ekspresi yang membentuk nama fungsi.Dynamic Function Call: Function Name On-the-fly
Kita dapat menggunakan satu atau lebih ekspresi di dalam tanda kurung sebagai nama fungsi hanya dalam sekali jalan, dalam bentuk:
Sebagai contoh:
Catatan: Meskipun menghapus tanda kurung
str_replace()
bukanlah kesalahan, menempatkan tanda kurung membuat kode lebih mudah dibaca. Namun, Anda terkadang tidak dapat melakukannya, misalnya saat menggunakan.
operator. Agar konsisten, saya sarankan Anda untuk selalu menempatkan tanda kurung.Dynamic Method Call: Metode Name On-the-fly
Sama seperti panggilan fungsi dinamis, kita dapat melakukan hal yang sama dengan pemanggilan metode, dikelilingi oleh kurung kurawal alih-alih tanda kurung (untuk formulir tambahan, navigasikan ke TL; bagian DR):
Lihat dalam contoh:
Metode Panggilan Dinamis: Sintaks Array
Cara yang lebih elegan ditambahkan di PHP7 adalah sebagai berikut:
Sebagai contoh:
Catatan: Manfaat menggunakan metode ini daripada yang sebelumnya adalah, Anda tidak peduli dengan jenis panggilan (yaitu apakah itu statis atau tidak).
Contoh Ekstra: Menggunakan Kelas Anonim
Membuat segalanya sedikit rumit, Anda bisa menggunakan kombinasi kelas anonim dan fitur di atas:
TL; DR (Kesimpulan)
Secara umum, di PHP7, menggunakan formulir berikut ini dimungkinkan:
Sebagian besar didasarkan pada pembicaraan PHP ini .
sumber
(expressions)->$bar()
Nama fungsi dinamis dan ruang nama
Hanya untuk menambahkan titik tentang nama fungsi dinamis saat menggunakan ruang nama.
Jika Anda menggunakan ruang nama, yang berikut ini tidak akan berfungsi kecuali jika fungsi Anda ada di ruang nama global:
Apa yang harus dilakukan?
Anda harus menggunakan
call_user_func()
sebagai gantinya:sumber
Melengkapi jawaban @Chris K jika Anda ingin memanggil metode objek, Anda dapat menyebutnya menggunakan variabel tunggal dengan bantuan penutupan:
Saya memposting contoh lain di sini
sumber
Apa yang saya pelajari dari pertanyaan ini dan jawabannya. Terima kasih semuanya!
Katakanlah saya memiliki variabel dan fungsi ini:
Untuk memanggil fungsi tanpa argumen
Untuk memanggil fungsi dengan 1 argumen
Untuk memanggil fungsi dengan 1 argumen atau lebih Ini akan berguna jika Anda memanggil fungsi Anda secara dinamis dan setiap fungsi memiliki jumlah argumen yang berbeda. Ini adalah kasus saya yang saya cari (dan selesaikan).
call_user_func_array
adalah kuncinyaYay sampai jumpa!
sumber
Gunakan fungsi call_user_func.
sumber
Kode berikut dapat membantu menulis fungsi dinamis dalam PHP. sekarang nama fungsi dapat diubah secara dinamis dengan variabel '$ current_page'.
sumber
$function
variabel tanpa alasan apa pun.Cara termudah untuk memanggil suatu fungsi dengan aman menggunakan nama yang disimpan dalam variabel adalah,
Saya telah menggunakan seperti di bawah ini untuk membuat tabel migrasi di Laravel secara dinamis,
sumber
Salah satu pendekatan yang tidak konvensional, yang muncul di benak saya adalah, kecuali jika Anda menghasilkan seluruh kode melalui beberapa super otonom AI yang menulis sendiri , ada kemungkinan besar bahwa fungsi yang Anda ingin panggilan "dinamis", sudah ditentukan dalam kode Anda mendasarkan. Jadi mengapa tidak memeriksa string dan melakukan
ifelse
tarian terkenal untuk memanggil ... Anda mengerti maksud saya.misalnya.
Bahkan
switch-case
dapat digunakan jika Anda tidak menyukai rasaifelse
tangga yang hambar .Saya mengerti bahwa ada kasus di mana " memanggil fungsi secara dinamis " akan menjadi kebutuhan mutlak ( Seperti beberapa logika rekursif yang memodifikasi sendiri ). Tetapi sebagian besar kasus penggunaan sepele sehari-hari hanya bisa dihindari.
Ini menghilangkan banyak ketidakpastian dari aplikasi Anda, sambil memberi Anda kesempatan untuk mengeksekusi fungsi mundur jika string tidak cocok dengan definisi fungsi yang tersedia. MENURUT OPINI SAYA.
sumber
if (method_exists($functionName)) $functionName(); else //exception or handle
Saya tidak tahu mengapa Anda harus menggunakan itu, sama sekali tidak terdengar baik bagi saya, tetapi jika hanya ada sedikit fungsi, Anda bisa menggunakan if / else jika membangun. Saya tidak tahu apakah solusi langsung mungkin.
sesuatu seperti $ foo = "bar"; $ test = "foo"; tes echo $$;
harus mengembalikan bar, Anda dapat mencoba tetapi saya tidak berpikir ini akan berfungsi untuk fungsi
sumber