Mengapa tanda tangan fungsi PHP sangat tidak konsisten? [Tutup]

17

Saya telah melalui beberapa fungsi PHP dan saya tidak dapat melihat hal-hal berikut:

<?php
function foo(&$var) { }

foo($a); // $a is "created" and assigned to null

$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)

$c = new StdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
?>

Perhatikan array_key_exists()dan property_exists()fungsinya. Dalam yang pertama, nama properti (kunci untuk array) adalah parameter pertama sedangkan yang kedua adalah parameter kedua. Dengan intuisi, orang akan mengharapkan mereka memiliki tanda tangan yang serupa. Hal ini dapat menyebabkan kebingungan dan waktu pengembangan dapat terbuang dengan melakukan koreksi jenis ini.

Bukankah seharusnya PHP, atau bahasa apa pun dalam hal ini, mempertimbangkan untuk membuat tanda tangan dari fungsi terkait konsisten?

Shamim Hafiz
sumber
2
+1 bravo, ini adalah salah satu hal pertama yang saya perhatikan tentang php dan selalu ditemukan menjengkelkan
Kevin
Ah. Gunakan IDE.
Ben Dubuisson

Jawaban:

10

Apa yang Anda usulkan pada dasarnya adalah mengubah tanda tangan ke banyak fungsi yang ada. Pikirkan sejenak apa efek yang akan terjadi pada kode yang ada. Sekarang anggaplah kelompok PHP telah merilis versi PHP N yang mengubah tanda tangan 30% dari fungsi. Sekarang bayangkan Anda harus menulis kode yang berjalan di PHP vN dan PHP v. {N-1} - seberapa menyenangkan hal itu?

Sekarang bayangkan Anda adalah manajer pusat data perusahaan atau hoster - insentif apa yang Anda miliki untuk mendukung PHP vN, asalkan setelah Anda beralih, semua kode akan rusak dan pengguna akan datang ke kantor Anda dengan garpu rumput dan obor?

StasM
sumber
4
+1 Sulit sekali Anda memulai sesuatu dengan cara yang salah, tetapi memiliki basis pengguna yang besar menggunakannya dalam kondisi saat ini.
Andy Fleming
4
Itu poin yang bagus. Saya sebenarnya sadar akan hal ini, tetapi poin utama saya adalah mereka seharusnya menyadari hal ini sejak awal.
Shamim Hafiz
7
@ Ashim Benar, yang merupakan bagian dari mengapa PHP memiliki reputasi yang buruk di tempat pertama;)
Andy Fleming
1
PHP, seperti banyak hal, dimulai sebagai alat kecil untuk memecahkan masalah kecil, jika seseorang akan mendesainnya "dengan benar" saat itu mungkin lebih baik daripada, tetapi mungkin tidak akan mencapai traksi, jadi tidak ada yang akan menggunakannya ... dan alat kecil lainnya akan "menang", sebuah alat dengan inkonsistensi yang berbeda ...
johannes
3
Itu sebabnya ada yang namanya penghinaan. Anda membuat nama-nama baru dan terstandarisasi, dan mencabut "salad-bar" nama fungsi yang lama tetapi membiarkannya untuk beberapa rilis. Pada titik yang dipublikasikan dengan baik Anda keluar dengan rilis versi utama baru yang tidak jauh dari mereka. Ini adalah bagaimana ini dilakukan. Ini pengecut murni pada bagian pengembang PHP bahwa mereka belum melakukan ini. Mereka mengendarai penghalang rendah untuk masuk yang memberikan PHP keunggulan atas bahasa web lainnya, dan mereka berhasil karena itu, jadi mereka TIDAK HARUS terus meningkatkan bahasa inti.
Dan Ray
10

Karena PHP adalah Bahasa Tanpa Spesifikasi Apa Pun.

Dan secara harfiah setiap orang dapat menambahkan beberapa fungsi, dan tidak ada pertanyaan tentang konsistensi pada awalnya. JADI, kekacauan.

ts01
sumber
tidak semua orang dapat menambahkan fungsi
StasM
@StasM: Siapa yang bisa, grup DEV? Tautan mana saja di mana saya dapat menemukan cara grup itu beroperasi?
Shamim Hafiz
@StasM: ok, saya sedikit melebih-lebihkan. Masalah sebenarnya adalah kurangnya konvensi sejak awal atau satu orang yang bertanggung jawab atas kohesi kode. Sekarang sudah terlambat. Saya ragu apakah itu dapat diubah tanpa benar-benar memalsukan PHP sebagai bahasa lain.
ts01
Prinsip operasi @Shamim Dev grup adalah dua: konsensus dan kepercayaan. Yang keren, tapi saya khawatir tidak cukup untuk pengembangan bahasa yang baik
ts01
@Shamim: mulai dengan php.net dan wiki.php.net.
StasM
4

Sebagian besar bahasa yang baik adalah dan berusaha untuk konsisten.

Itu hanya realitas keadaan PHP. Seperti yang disebutkan oleh StasM, akan menjadi mimpi buruk untuk mencoba dan mengubah hal-hal seperti itu setelah fakta. Itu akan mempengaruhi terlalu banyak kode yang ada. Seringkali PHP hanya mencela fungsi dan membuat fungsi baru yang lebih baik yang lebih konsisten, tetapi itu bisa memakan banyak waktu.

Saya pikir pemrogram PHP yang sukses baik mengingat sintaks tertentu atau menggunakan perangkat lunak yang secara otomatis memberi tahu mereka sintaks.

Andy Fleming
sumber
fungsi mencela adalah satu hal, yang mudah. Mengubah urutan argumen lebih, lebih sulit
ts01
@ ts01 kuku masalah penting. Dengan hanya parameter posisi, tidak ada cara untuk mengetahui bahwa keberadaan Anda foo(a,b)saat ini seharusnya foo(b,a)karena seseorang mengubah tanda tangan foo.
Frank Shearar
@ TS01, @Frank: Anda harus mengubah nama fungsi, juga ... bukan ide yang sangat baik untuk hal-hal seperti "property_exists" di mana ada adalah tidak ada nama yang layak lainnya. Secara pribadi, saya ingin melihat array menjadi objek yang sebenarnya sehingga Anda bisa mengatakan $array->key_exists('whatever')tetapi, meh :-)
Dean Harding
Sebenarnya, apa yang bisa dilakukan oleh pengembang PHP adalah membuat fungsi baru mereka sendiri untuk membungkusnya. Perhatikan juga bahwa isset () memiliki sintaks universal untuk kedua contoh yang disebutkan, tetapi mereka tidak ditinggalkan sebagai bagian dari spec yang dikompilasi.
user1122069
3

Sumber utama ketidakkonsistenan adalah banyak (sebagian?) Php dalam fungsi-fungsi bawaan benar-benar dibungkus dengan beberapa pustaka C. Pemikiran awal adalah "Saya membungkus fungsi C xxxx karena itu saya harus menjaga agar parameter tetap sama". Ketika datang untuk menulis "php murni" fungsi pemikiran ini diperluas ke "xxxx mengambil file dan opsi fungsi baru mengambil nama file dan opsi sehingga masuk akal untuk mengambil parameter yang sama dalam urutan yang sama.

Kelemahan besar di sini adalah bahwa pustaka C yang mendasarinya sangat tidak konsisten untuk memulai.

James Anderson
sumber
Mereka juga menyimpan nama fungsi C yang mereka bungkus dalam beberapa kasus (fungsi str khususnya) sambil menyimpang secara liar dari konvensi penamaan C (seperti mereka) untuk nama fungsi lainnya.
Dan Ray
2

Alasan (a?) Adalah untuk tetap kompatibel dengan versi PHP sebelumnya. Alih-alih mengubah nama fungsi yang akan merusak banyak aplikasi, fungsi tetap. Namun, dengan intuisi, ya penamaan fungsi yang konsisten harus dipertimbangkan untuk bahasa baru.

Saya harus tidak setuju dengan Anda pada kenyataan waktu pengembangan terbuang. Mempelajari PHP mungkin membutuhkan waktu lebih lama untuk memahami penamaan fungsi-fungsi tertentu, tetapi begitu dikuasai (atau setidaknya disadari) itu menjadi masalah.

Kompatibilitas> Konsistensi (setidaknya ke PHP)

Jesse
sumber
1
Bahasa lain, saya bisa menulis tanpa referensi konstan ke dokumen. PHP Saya selalu harus khawatir tentang ... apakah fungsi ini dieja "str_" atau hanya "str"? Apakah ini "array _" - sesuatu atau kita tidak menyebutkan array? Apa yang dilakukan "length ()" saat diberi string? Oh, tidak, itu "strlen ()" Aku benar-benar ingin ... Apakah itu "jarum, tumpukan jerami" atau "tumpukan jerami, jarum"? Tidak ada bahasa lain yang menempatkan saya dalam semua itu.
Dan Ray
Seperti Anda, saya terus-menerus diganggu oleh @DanRay ini. Saya sudah mulai menggunakan NetBeans PHP IDE sekarang yang memberi saya info persis yang saya butuhkan di editor.
deed02392