Saya bingung tentang nilai default untuk fungsi PHP. Katakanlah saya memiliki fungsi seperti ini:
function foo($blah, $x = "some value", $y = "some other value") {
// code here!
}
Bagaimana jika saya ingin menggunakan argumen default untuk $ x dan menetapkan argumen lain untuk $ y?
Saya telah bereksperimen dengan berbagai cara dan saya semakin bingung. Misalnya, saya mencoba keduanya:
foo("blah", null, "test");
foo("blah", "", "test");
Tetapi keduanya tidak menghasilkan argumen default yang tepat untuk $ x. Saya juga mencoba mengaturnya dengan nama variabel.
foo("blah", $x, $y = "test");
Saya sepenuhnya berharap sesuatu seperti ini bekerja. Tetapi itu tidak bekerja seperti yang saya harapkan sama sekali. Sepertinya apa pun yang saya lakukan, saya harus tetap mengetikkan argumen default, setiap kali saya memanggil fungsi. Dan saya pasti kehilangan sesuatu yang jelas.
foo("blah", , "test");
?Jawaban:
Saya akan mengusulkan mengubah deklarasi fungsi sebagai berikut sehingga Anda dapat melakukan apa yang Anda inginkan:
Dengan cara ini, Anda dapat membuat panggilan seperti
foo('blah', null, 'non-default y value');
dan membuatnya berfungsi sesuai keinginan, di mana parameter kedua$x
masih mendapatkan nilai default.Dengan metode ini, meneruskan nilai nol berarti Anda menginginkan nilai default untuk satu parameter ketika Anda ingin mengganti nilai default untuk parameter yang datang setelahnya.
Sebagaimana dinyatakan dalam jawaban lain,
Jika saya memiliki metode yang dapat menerima berbagai jumlah parameter, dan parameter dari berbagai jenis, saya sering menyatakan fungsi yang mirip dengan jawaban yang ditunjukkan oleh Ryan P.
Ini adalah contoh lain (ini tidak menjawab pertanyaan Anda, tetapi semoga informatif:
sumber
null
nilai nyata ke parameter, karena setiap kali akan menetapkan nilai default. Bahkan jika Anda memiliki nilai khusus lain ketika Anda benar-benar menginginkan nol (mis. Ketika $ x == "use_null" menghasilkan $ x = null), maka Anda tidak akan dapat menetapkan nilai khusus seperti nilai literal dari parameter (dalam hal ini, string "use_null"). Jadi pastikan untuk menggunakan "kunci" unik, yang tidak pernah diinginkan untuk saat Anda ingin menggunakan nilai default (dan Anda inginnull
menjadi opsi yang valid)Argumen opsional hanya berfungsi di akhir panggilan fungsi. Tidak ada cara untuk menentukan nilai untuk $ y dalam fungsi Anda tanpa juga menentukan $ x. Beberapa bahasa mendukung ini melalui parameter bernama (VB / C # misalnya), tetapi bukan PHP.
Anda bisa meniru ini jika Anda menggunakan array asosiatif untuk parameter alih-alih argumen - yaitu
Kemudian panggil fungsi seperti ini:
sumber
isset($args['x'])
, karena saat ini akan menggantikan string kosong, array kosong, ataufalse
dengan nilai default.$x = !array_key_exists('x',$args) ? 'default x value' : $args['x'];
Itu sebenarnya mungkin:
Apakah Anda ingin melakukannya adalah cerita lain :)
MEMPERBARUI:
Alasan untuk menghindari solusi ini adalah:
Tapi itu sebenarnya bisa berguna dalam situasi di mana:
Anda tidak ingin / tidak dapat mengubah fungsi aslinya.
Anda bisa mengubah fungsinya tetapi:
null
(atau setara) bukanlah suatu opsi (lihat komentar DiegoDD )func_num_args()
Tentang kinerja, tes yang sangat sederhana menunjukkan bahwa menggunakan API Refleksi untuk mendapatkan parameter default membuat panggilan fungsi 25 kali lebih lambat , sementara itu masih membutuhkan waktu kurang dari satu mikrodetik . Anda harus tahu apakah Anda bisa hidup dengan itu.
Tentu saja, jika Anda bermaksud menggunakannya dalam satu lingkaran, Anda harus mendapatkan nilai default terlebih dahulu.
sumber
sumber
$defaults = [ 'x' => 'some value', 'y' => 'some other value'];
Satu-satunya cara saya tahu melakukannya adalah dengan menghilangkan parameter. Satu-satunya cara untuk menghilangkan parameter adalah dengan mengatur ulang daftar parameter sehingga yang ingin Anda hapus adalah setelah parameter yang Anda HARUS atur. Sebagai contoh:
Maka Anda dapat memanggil foo seperti:
Ini akan menghasilkan:
sumber
Baru-baru ini saya mengalami masalah ini dan menemukan pertanyaan dan jawaban ini. Sementara pertanyaan di atas berfungsi, masalahnya adalah mereka tidak menunjukkan nilai default ke IDE yang mendukungnya (seperti PHPStorm).
jika Anda menggunakan
null
Anda tidak akan tahu apa nilainya jika Anda membiarkannya kosong.Solusi yang saya sukai adalah dengan meletakkan nilai default dalam definisi fungsi juga:
Satu-satunya perbedaan adalah bahwa saya perlu memastikan mereka sama - tetapi saya pikir itu harga kecil untuk membayar kejelasan tambahan.
sumber
Anda tidak dapat melakukan ini secara langsung, tetapi sedikit kode mengutak-atik memungkinkan untuk ditiru.
sumber
null
dalam hal ini secara konseptual lebih rapi daripadafalse
.false
adalah pilihan yang lebih berisiko daripadanull
, karena php adalah bahasa yang tidak ketat.!$x
akan berlaku untuk beberapa input berbeda, yang mungkin mengejutkan programmer:0
,''
. Sedangkan dengannull
, Anda bisa menggunakan!isset
tes yang lebih ketat.sumber
2 sen saya dengan operator penggabungan nol
??
(sejak PHP 7)Anda dapat memeriksa lebih banyak contoh di repl.it saya
sumber
Ini terjadi, ketika objek lebih baik - karena Anda dapat mengatur objek Anda untuk menahan x dan y, mengatur default dll.
Pendekatan dengan array dekat untuk membuat objek (Faktanya, objek adalah sekelompok parameter dan fungsi yang akan bekerja di atas objek, dan array yang mengambil fungsi akan bekerja pada beberapa parameter sekelompok ov)
Tentunya Anda selalu dapat melakukan beberapa trik untuk menetapkan null atau sesuatu seperti ini sebagai default
sumber
Anda juga dapat memeriksa apakah Anda memiliki string kosong sebagai argumen sehingga Anda dapat memanggil seperti:
foo('blah', "", 'non-default y value', null);
Di bawah fungsi:
Tidak masalah jika Anda mengisi
null
atau""
, Anda masih akan mendapatkan hasil yang sama.sumber
Lewatkan array ke fungsi, alih-alih parameter individual dan gunakan operator penggabungan nol (PHP 7+).
Di bawah, saya melewati array dengan 2 item. Di dalam fungsi, saya memeriksa apakah nilai untuk item1 diatur, jika tidak ditetapkan sebagai default vault.
sumber
$args['item1'] = $args['item1']??'default value';
PHP 7+. jika $ args ['item1'] adalah null makadefault value
string akan menetapkan ke $ args ['item1']