Php fonksiyonun girdi olarak ilişkilendirilebilir bir dizi kullanarak

10 Cevap php

Bazen bir tek giriş, bu işlevin tüm girişler içeren bir ilişkisel dizi ile bir PHP işlevini yazacağım. Bu tür girdilerin doğru sırasını hatırlamak zorunda değil gibi faydaları vardır, ama aynı zamanda çok daha kolay büyük codebases değişiklikleri uygulamak yapar fark ettik; Ben başka bir değişken eklemeniz gerekir, ve bu değişken 4 veya 5 önceden mevcut fonksiyonları geçmek olduğunda ben sadece dizide sopa ve bunu iletmekten zaman, çok daha kolay bulunuyor.

Benim sorum bu yaptığını bir dezavantajı var, nedir?

Bir dezavantajı muhtemelen olduğuna inanıyorum beni neden, ben nadiren işlevleri örneklerde bu şekilde yazılmış görmek, ya da açık kaynak kullanmam. Eğer orada isn't bir sebebi tüm fonksiyonlarını bu şekilde yazmak değil o zaman bunu yapmak için değil mi?

UPDATE

Tüm cevaplar için teşekkürler. Iki önemli sorun göze çarpıyor gibi görünüyor:

Code readability - imkansız Ne için olduklarını bir işlevi girmeden ne değişkenler anlatmak ve

Variable creep - sonraki bir işlevi sıçrayan kitlesel diziler ile rüzgar misiniz; Kimse onları gerekmez işlevlerine parametreler vermemelisiniz

Hem ben düşünmedim büyük noktaları Hangi.

Bir de genel özü görünüyor bu bir sorun olduğunu kodu, muhtemelen bir sınıfa dönüştürülmesi gerekir. Ne yazık ki bu özel projede böyle bir üstlenmeden kapsamı dışındadır, ama ben de Bill Karwin çözümü iyi olduğunu düşünüyorum - isteğe bağlı değişkenler dizisi geçmek

10 Cevap

neden tüm fonksiyonları bu şekilde yazmak değil mi?

Bu konuda, neden tamamen parametreleri hakkında unutmayın, ve her şey için global değişkenler kullanabilir? (Şaka)

Bir ilişkisel dizi geçirmeden biri yararlı avantajı vardır: Birden fazla fonksiyon parametreleri isteğe yapabilir ve parametre inci * N-1 * için bir değer geçmek zorunda kalmadan parametre inci * N * için bir değer iletebilirsiniz.

Ama sen onları geçmek yoksa bir derleme zamanı hatası ile zorunlu parametreleri yapmak için hiçbir yolu yoktur. Ne sen tip denetimini bildirebilirsiniz.

Sen varlığı ve gerekli parametrelerin tipi kontrol etmek için çağırdı işlev içinde kod yazmak zorunda kalırsınız.

Ben kullandım bir alternatif zorunlu olanlar için geleneksel parametreleri beyan ve ardından son (opsiyonel) argüman olarak, $options, sadece isteğe bağlı öğeleri içerdiğini adlandırılan ilişkilendirilebilir bir dizi ilan etmektir.

function database_connect($dbname, $user, $password, array $options = array())

Olumsuz (senden başka) kodu baktığımızda herkes parametreleri geldikleri, ya da ne onlar için bir yöntem haline geliyor ne hiçbir fikrim yok olduğunu ifade etti. Onlar da bu "parametre dizisi" içinde gerekli tam olarak ne kodu bakmadan net olmadığı bir yöntemi çağırmak için nasıl hiçbir fikrim yok olurdu.

presumably one of the downsides is that you'll end up with way too many parameters. This leads to the problem that the code is likely to lose it's readability.

Sıkı bir Nesne Tabanlı yaklaşımda yöntemleri tutan sınıfların örnek-değişkenleri birden fazla fonksiyon çağrıları "geçer" tüm bu parametreleri dönüştürmek istiyorsunuz.

Aslında onlar tarafından gerekli değildir işlevlerine parametreler iletebilirsiniz asla.

PHP birçok modern programlama dilleri (Python, Ruby, vb) bulunan "anahtar kelime argümanlar" özelliği yoksun beri bu, mutlaka bir fikir o kadar da kötü değil. Ancak, onunla kesinlikle birkaç sorun vardır:

  1. Eğer bir işlev kabul parametreleri değiştirirseniz, o zaman bu yeni parametreleri maç, yine deniyor bazı kodunu değiştirmek gerekecek olasıdır.

  2. Eğer yoğun bu dizileri kullanarak ediyorsanız, ve yapılandırılmış bir sınıfa bu parametrelerin bazı dönüm düşünmesi gereken bir işareti olabilir pek çok fonksiyon çağrıları bir dizi alarak ve sadece "birlikte geçen,".

  3. Eğer bir değişken veri yapısı olarak bu dizileri kullanarak yapıyorsanız, mutlaka işlevi çağırdıktan sonra sahip dizi bu muhtemelen bir noktada sizi almak için geri gelecek içeri geçti biri olarak aynı olduğunu bilmiyorum.

Her parametreyi İlan kodu okunabilirliği artırabilirsiniz. Tek bir birleştirici dizisi geçirerek mutlaka bir işleve geçirilen verilerde ne tür (ler) açıklamak olmaz.

Ben fonksiyonu almak ve sadece tek bir fonksiyon argüman içerisindeki hash değerleri referans başladığını görmek için olsaydı, ben biraz karışık olurdu. Açıkça değişkenleri belirten ve @ param kullanarak bir bilgilendirme kısmı içindeki belgelerin biraz vererek derece yardımcı olur. Iki yerde bir argüman eklemek zorunda argümanlar verim listeleme okunabilirlik karşılaştırıldığında küçük bir maliyettir.

Burada büyük kod koku başka bir değişken ekleyerek 4-5 farklı işlevler basamakla olduğunu ifade etti. Ben gerçekten bu gerçekleşmesi gerekir bir sebep düşünemiyorum.

O zaman bir yapıcı bir kez değerlerini geçmek ve üye değişkenler olarak kaydedebilirsiniz böylece bir sınıf içine bu kodu refactor gerekir gibi geliyor.

Bu adlandırılmış ve ayrı ayrı geçirilen parametreleri varsa bu çok daha kolay belgeleri oluşturmak için yapar. Sen bir dizi kullanarak daha kolay yeni kod eklemek için yapar düşünebilirsiniz, ama ters okunabilirliği orada dövmek değil. Artı 2 ay boyunca uzakta kod gitmek ve durumları büyük bir baş ağrısı olacak olan sizin diziye params'ı eklemek için ne amacıyla sergiyi ... gel.

Bazı durumlarda bu hissediyorum mantıklı geliyor, ama genellikle biraz farklı davranışları ile birden çok yöntem oluşturarak şeyler kolaylaştırabilirsiniz. Yöntemin adı o zaman açık ne için olduğunu yapacaktır.

Lütfen fonksiyonları> 3 argümanlar varsa, genel olarak yine okunamaz hale gelecektir.

Bir alternatif olarak, ve sık kullanılan deseni fonksiyonu bir (IACS-) nesne, tek bir argüman yapıyor. 'Parametre sınıfı' desteklenen tam olarak ne tanımlamak olacaktır.

Birisi hala bir çözüm ararken eğer - işte burada (örnek fonksiyonu olan __ construct()):

Extract $_GET/$_POST params and pass them to constructor