PHP işlev imzaları neden bu kadar tutarsız? [kapalı]


17

Bazı PHP fonksiyonları üzerinden gidiyordu ve ben aşağıdaki fark yardımcı olamazdı:

<?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)
?>

array_key_exists()Ve property_exists()fonksiyonuna dikkat edin . Birincisinde, özellik adı (bir dizi için anahtar) ilk parametredir, ikincisinde ikinci parametredir. Sezgisel olarak, onların da benzer bir imzası olmasını bekleriz. Bu karışıklığa yol açabilir ve bu tür düzeltmeler yapılarak geliştirme süresi boşa gidebilir.

PHP veya bu konudaki herhangi bir dil, ilgili işlevlerin imzalarını tutarlı hale getirmeyi düşünmemeli midir?


2
+1 bravo, php hakkında fark ettiğim ve her zaman sinir bozucu bulduğum ilk şeylerden biri
Kevin

Meh. Bir IDE kullanın.
Ben Dubuisson

Yanıtlar:


10

Teklif ettiğiniz şey aslında mevcut birçok işleve imza değiştirmek. Bir dakika boyunca mevcut kod üzerinde ne gibi bir etki yaratacağını düşünün. Şimdi PHP grubunun işlevlerin% 30'unun imzalarını değiştiren PHP sürüm N'yi yayınladığını varsayalım. Şimdi PHP vN ve PHP v {N-1} üzerinde çalışan kod yazmak zorunda olduğunu düşünün - bu ne kadar eğlenceli olurdu?

Şimdi bir ev sahibi veya kurumsal veri merkezi yöneticisi olduğunuzu düşünün - geçiş yaptıktan sonra tüm kodların kırılması ve kullanıcıların dirgenler ve meşalelerle ofisinize gelmesi şartıyla PHP vN'yi desteklemek için ne teşvik etmeniz gerekir?


4
+1 Bir şeye yanlış bir şekilde başladıktan sonra zor, ancak mevcut durumunda bu kadar geniş bir kullanıcı tabanına sahip olmak zor.
Andy Fleming

4
İyi bir noktaya değindin. Aslında bunun farkındaydım, ama asıl amacım bunun ilk başta farkında olmalarıydı.
Shamim Hafiz

7
@Shamim True, PHP'nin neden ilk başta kötü bir üne sahip olduğunu bir parçasıdır;)
Andy Fleming

1
PHP, pek çok şey gibi, küçük bir sorunu çözmek için küçük bir araç olarak başladı, eğer biri onu "düzgün" olarak tasarlarsa, o zamandan daha güzel olabilir, ama belki çekişe ulaşamazdı, bu yüzden kimse kullanmazdı ... ve başka bir küçük araç, farklı tutarsızlıklara sahip bir araç olan "kazandı" ...
johannes

3
Bu yüzden itiraz gibi bir şey var. Yeni, standartlaştırılmış adlar oluşturuyor ve işlev adlarının eski "salata çubuğunu" kaldırıyorsunuz, ancak birkaç sürüm için bunları bırakıyorsunuz. İyi duyurulmuş bir noktada, onlarla birlikte yok olan yeni bir büyük sürüm sürümü ile çıkacaksınız. Bu böyle yapılır. PHP geliştiricilerinin bunu yapmadığı saf korkaklık. PHP'ye diğer web dillerinde üstünlük sağlayan girişin önündeki düşük engeli kullanıyorlar ve bu nedenle başarılı oluyorlar, bu yüzden temel dili geliştirmeye devam etmek zorunda değiller.
Dan Ray

10

Çünkü PHP, herhangi bir belirtimi olmayan dildir.

Ve kelimenin tam anlamıyla herkes birkaç işlev ekleyebilirdi ve başlangıçta tutarlılık sorunu yoktu. Yani, karmaşa.


herkes işlev ekleyemez
StasM

@StasM: DEV grubu kim yapabilir? Bu grubun nasıl çalıştığını bulabileceğim bir bağlantı var mı?
Shamim Hafiz

@StasM: tamam, biraz abarttım. asıl sorun, başlangıçtan beri konvansiyonların olmaması ya da kod uyumundan sorumlu bir kişi. Şimdi çok geç. Bu kelimenin tam anlamıyla PHP başka bir dil olarak çatal olmadan değiştirilebilir eğer şüphe.
ts01

@Shamim Dev grubu çalışma prensipleri iki: uzlaşma ve güven. Hangi güzel, ama korkuyorum iyi dil gelişimi için yeterli değil
ts01

@Shamim: php.net ve wiki.php.net ile başlayın.
StasM

4

Çoğu iyi dil tutarlıdır ve tutarlı olmaya çalışır.

Sadece PHP devletinin gerçeğidir. StasM'in belirttiği gibi, bundan sonra böyle şeyleri denemek ve değiştirmek bir kabus olurdu. Mevcut kodu çok fazla etkiler. Genellikle PHP işlevleri reddeder ve daha tutarlı, ancak çok zaman alabilen daha yeni daha iyi işlevler oluşturur.

Başarılı PHP programcılarının ya sözdizimini hatırladığını ya da sözdizimini otomatik olarak söyleyen yazılımı kullandığını düşünüyorum.


küçümseme işlevi kolay bir şeydir. Argüman sırasını değiştirmek çok daha zor
ts01

@ ts01 temel sorunu çözer. Sadece konumsal parametrelerle, var foo(a,b)olanınızın şimdi foo(b,a)birinin birinin imzasını değiştirdiği için olması gerektiğini bilmenin bir yolu yoktur .
Frank Shearar

@ TS01, @Frank: Orada "property_exists" gibi şeyler için değil özellikle iyi bir fikir ... de fonksiyonun adını değiştirmek zorunda kalacak olan başka iyi isim. Şahsen, dizilerin gerçek nesneler haline geldiğini görmek istiyorum, $array->key_exists('whatever')ama diyebilirsiniz ama, meh :-)
Dean Harding

Aslında, herhangi bir PHP geliştiricisinin yapabileceği, bunları sarmak için kendi yeni işlevlerini oluşturmaktır. Ayrıca, isset () yönteminin her iki örnek için de evrensel bir sözdizimine sahip olduğuna dikkat edin, ancak bunlar derlenmiş spesifikasyonun bir parçası olarak kullanımdan kaldırılmamıştır.
user1122069

3

Tutarsızlığın en büyük kaynağı, php'nin yerleşik fonksiyonlardaki birçok (en?) Gerçekten bazı C kütüphanesi etrafındaki sarıcı olmasıdır. İlk düşünce "Ben C fonksiyonu xxxx sarma ediyorum, bu nedenle parametre sırasını aynı tutmak gerekir" oldu. Bir "saf php" işlevi yazmaya geldiğinde bu düşünme "xxxx dosya ve seçenekleri alır yeni işlevi bir dosya adı ve seçenekleri alır, böylece yyyy aynı sırayla aynı sırayla alması mantıklı.

Buradaki büyük kusur, temeldeki C kütüphanelerinin başlangıçta çok tutarsız olması.


Ayrıca, bazı durumlarda sardıkları C işlev adlarını (özellikle str işlevleri) tutarken, C'nin diğer işlev adları için adlandırma kurallarından (oldukları gibi) çılgınca ayrılırlar.
Dan Ray

2

(A?) Nedeni PHP'nin önceki sürümleriyle uyumlu kalmaktı. Birçok uygulamayı bozacak işlev adlarını değiştirmek yerine işlevler kalır. Ancak, yeni diller için sezgisel olarak evet, tutarlı işlev adlandırma dikkate alınmalıdır.

Gelişim zamanının boşa harcandığı konusunda sizinle aynı fikirde olmam gerekiyor. PHP öğrenmek, belirli işlevlerin adlandırılmasını anlamak için daha uzun sürebilir, ancak bir kez hakim olduktan (veya en azından farkında olduktan sonra) sorun olmaz.

Uyumluluk> Tutarlılık (en azından PHP'ye)


1
Diğer diller, belgelere sürekli başvuru yapmadan yazabilirim. PHP Her zaman endişelenmek zorunda ... Bu işlev "str_" veya sadece "str" ​​yazıldığından? Bu "dizi _" - bir şey mi yoksa dizilerden bahsetmiyoruz mu? Bir string verildiğinde "length ()" ne yapar? Oh, cehennem, hayır, gerçekten "strlen ()" istedim ... "iğne, samanlık" veya "samanlık, iğne" mi? Başka hiçbir dil beni bunlardan geçiremez.
Dan Ray

Senin gibi sürekli bu @DanRay tarafından rahatsız edildi. NetBeans PHP IDE'yi kullanmaya başladım, ancak bana editörde tam olarak ihtiyacım olan bilgileri veriyor.
deed02392
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.