Oke, saya benar-benar lupa cara melewati argumen di PHP.
Katakanlah saya punya:
function getData($name, $limit = '50', $page = '1') {
...
}
Bagaimana saya memanggil fungsi ini sehingga parameter tengah mengambil nilai default (mis. '50')?
getData('some name', '', '23');
Apakah hal di atas benar? Sepertinya aku tidak bisa membuat ini bekerja.
php
function
parameters
default-value
optional-parameters
Chuck Le Butt
sumber
sumber
ReflectionFunction
. Saya memposting jawaban itu dalam pertanyaan serupa.Jawaban:
Posting Anda benar.
Sayangnya, jika Anda perlu menggunakan parameter opsional di bagian paling akhir dari daftar parameter, Anda harus menentukan semuanya hingga parameter terakhir tersebut. Umumnya jika Anda ingin mencampur-dan-mencocokkan, Anda memberi mereka nilai default
''
ataunull
, dan tidak menggunakannya di dalam fungsi jika nilai default tersebut.sumber
$limit = is_numeric($limit) ? $limit : '50';
pada awal fungsi getDataTidak ada cara untuk "melewati" argumen selain menentukan default like
false
ataunull
.Karena PHP kekurangan beberapa gula sintaksis dalam hal ini, Anda akan sering melihat sesuatu seperti ini:
Yang, seperti yang dengan fasih dikatakan di komentar, menggunakan array untuk meniru argumen bernama.
Ini memberikan fleksibilitas tertinggi tetapi mungkin tidak diperlukan dalam beberapa kasus. Paling tidak Anda dapat memindahkan apa pun yang menurut Anda tidak diharapkan pada sebagian besar waktu ke akhir daftar argumen.
sumber
Tidak, tidak mungkin melewatkan argumen dengan cara ini. Anda dapat menghilangkan argumen yang lewat hanya jika argumen tersebut berada di akhir daftar parameter.
Ada proposal resmi untuk ini: https://wiki.php.net/rfc/skipparams , yang ditolak. Halaman proposal menautkan ke pertanyaan SO lainnya tentang topik ini.
sumber
Tidak ada yang berubah mengenai kemampuan untuk melewati argumen opsional, namun untuk sintaks yang benar dan untuk dapat menentukan NULL untuk argumen yang ingin saya lewati, berikut cara saya melakukannya:
Ini dapat dipanggil demikian:
getData('some name',NULL,'23');
dan siapa pun yang memanggil fungsi di masa mendatang tidak perlu mengingat default setiap kali atau konstanta yang dideklarasikan untuk mereka.sumber
Jawaban sederhananya adalah Tidak . Tetapi mengapa melewatkan saat mengatur ulang argumen mencapai ini?
Milik Anda adalah " Penggunaan argumen fungsi default yang salah " dan tidak akan berfungsi seperti yang Anda harapkan.
Catatan tambahan dari dokumentasi PHP:
Pertimbangkan hal berikut:
Outputnya adalah:
Penggunaan yang benar dari argumen fungsi default harus seperti ini:
Outputnya adalah:
Menempatkan default di kanan Anda setelah non-default memastikan bahwa itu akan selalu mengembalikan nilai default untuk variabel itu jika tidak ditentukan / diberikan Berikut adalah link untuk referensi dan dari mana contoh-contoh itu berasal.
Sunting: Menyetelnya
null
seperti yang disarankan orang lain mungkin berhasil dan merupakan alternatif lain, tetapi mungkin tidak sesuai dengan apa yang Anda inginkan. Ini akan selalu mengatur default ke null jika tidak ditentukan.sumber
Untuk setiap parameter yang dilewati (Anda harus) pergi dengan parameter default, agar aman.
(Menetapkan untuk null di mana parameter default adalah '' atau serupa atau sebaliknya akan membuat Anda bermasalah ...)
sumber
Seperti disebutkan di atas, Anda tidak akan dapat melewati parameter. Saya telah menulis jawaban ini untuk memberikan beberapa tambahan, yang terlalu besar untuk dimasukkan dalam komentar.
@Frank Nocke mengusulkan untuk memanggil fungsi dengan parameter defaultnya, jadi misalnya memiliki
kamu harus menggunakan
yang secara fungsional akan sama dengan menghilangkan dua parameter (
$b
dan$c
) pertama.Tidak jelas mana yang default (
0
diketik untuk memberikan nilai default, atau penting?).Ada juga bahaya bahwa masalah nilai default terhubung ke fungsi eksternal (atau built-in), ketika nilai default dapat diubah oleh pembuat fungsi (atau metode). Jadi jika Anda tidak ingin mengubah panggilan Anda dalam program ini, Anda dapat secara tidak sengaja mengubah perilakunya.
Beberapa solusi mungkin untuk menentukan beberapa konstanta global, seperti
DEFAULT_A_B
yang akan menjadi "nilai default parameter B dari fungsi A" dan parameter "menghilangkan" dengan cara ini:Untuk kelas, akan lebih mudah dan elegan jika Anda mendefinisikan konstanta kelas, karena mereka adalah bagian dari cakupan global, mis.
Perhatikan bahwa konstanta default ini didefinisikan tepat satu kali di seluruh kode (bahkan tidak ada nilai dalam deklarasi metode), jadi jika terjadi beberapa perubahan yang tidak terduga, Anda akan selalu menyediakan fungsi / metode dengan nilai default yang benar.
Kejelasan dari solusi ini tentu saja lebih baik daripada memberikan nilai default mentah (seperti
NULL
,0
dll.) Yang tidak mengatakan apa-apa kepada pembaca.(Saya setuju bahwa menelepon seperti
$var = a(,,'ddd');
akan menjadi pilihan terbaik)sumber
Anda tidak dapat melewatkan argumen tetapi Anda dapat menggunakan parameter array dan Anda hanya perlu menentukan 1 parameter, yang merupakan array parameter.
Dan Anda dapat menambahkan sebanyak mungkin parameter yang Anda butuhkan, Anda tidak perlu menentukannya. Saat Anda memanggil fungsi tersebut, Anda meletakkan parameter Anda seperti ini:
sumber
Seperti yang sudah dikatakan orang lain, bahwa apa yang Anda inginkan tidak akan mungkin terjadi di PHP tanpa menambahkan baris kode apa pun di dalam fungsinya.
Tetapi Anda dapat menempatkan potongan kode ini di bagian atas fungsi untuk mendapatkan fungsionalitas Anda:
Jadi pada dasarnya dengan
debug_backtrace()
saya mendapatkan nama fungsi di mana kode ini ditempatkan, untuk kemudian membuatReflectionFunction
objek dan loop baru melalui semua argumen fungsi.Dalam loop saya hanya memeriksa apakah argumen fungsi
empty()
DAN argumennya adalah "opsional" (berarti ia memiliki nilai default). Jika ya, saya cukup menetapkan nilai default ke argumen.Demo
sumber
Tetapkan batas ke nol
dan memanggil fungsi itu
jika Anda ingin menyetel batas, Anda dapat meneruskan sebagai argumen
sumber
Seperti yang disarankan sebelumnya , tidak ada yang berubah. Berhati-hatilah, terlalu banyak parameter (terutama yang opsional) merupakan indikator kuat dari code bau.
Mungkin fungsi Anda terlalu banyak:
Beberapa parameter dapat dikelompokkan secara logis:
Pilihan terakhir, Anda selalu dapat memasukkan objek parameter ad-hoc :
(yang hanya merupakan versi yang dimuliakan dari teknik parameter array yang kurang formal )
Terkadang, alasan untuk membuat parameter opsional salah. Dalam contoh ini, apakah
$page
benar - benar dimaksudkan sebagai opsional? Apakah menyimpan beberapa karakter benar-benar membuat perbedaan?sumber
Cuplikan ini:
Jawabannya adalah:
sumber
Inilah yang akan saya lakukan:
Semoga ini bisa membantu seseorang
sumber
Ini adalah jenis pertanyaan lama dengan sejumlah jawaban yang secara teknis kompeten, tetapi ini merupakan salah satu pola desain modern dalam PHP: Pemrograman Berorientasi Objek. Daripada memasukkan kumpulan tipe data skalar primitif, pertimbangkan untuk menggunakan "objek yang diinjeksi" yang berisi semua data yang dibutuhkan oleh fungsi. http://php.net/manual/en/language.types.intro.php
Objek yang diinjeksi mungkin memiliki rutinitas validasi properti, dll. Jika instansiasi dan injeksi data ke dalam objek yang diinjeksi tidak dapat melewati semua validasi, kode dapat langsung mengeluarkan pengecualian dan aplikasi dapat menghindari proses transaksi yang canggung. dengan data yang berpotensi tidak lengkap.
Kita bisa memberi petunjuk pada objek yang diinjeksi untuk mendeteksi kesalahan sebelum penerapan. Beberapa ide dirangkum dalam artikel ini dari beberapa tahun yang lalu.
https://www.experts-exchange.com/articles/18409/Using-Named-Parameters-in-PHP-Function-Calls.html
sumber
Saya harus membuat Pabrik dengan parameter opsional, solusi saya adalah menggunakan operator penggabungan nol:
Pemakaian:
Bukan yang tercantik, tapi mungkin pola yang baik untuk digunakan di Pabrik untuk pengujian.
sumber
Coba ini.
sumber
Anda tidak dapat melewatkan parameter tengah dalam pemanggilan fungsi Anda. Tapi, Anda bisa menyiasatinya dengan ini:
Fungsi:
sumber
Seperti yang ditunjukkan @IbrahimLawal. Praktik terbaik adalah mengaturnya ke
null
nilai. Cukup periksa apakah nilai yang diteruskannull
di mana Anda menggunakan default yang Anda tentukan.Semoga ini membantu.
sumber
hanya saja, jangan melewatkannya dan nilai default akan diterima
sumber