Dizi parametre

5 Cevap php

CakePHP fonksiyonlara parametre çok sayıda geçirilmesi için birleşmeli diziler ağır kullanır. Gerçekten PHP dışında bu tekniği görmedim ve Kek onu kullandığı ölçüde kullanılan görmedim. Ben gerçekten bu yaklaşım gibi çünkü kendi kod gelecekteki sürümlerinde yeni parametreleri işlemek için daha kolay olurdu gibi görünüyor ve çok params sadece uzun bir liste daha okunabilir olduğu gibi.

Bir örnek olarak ...

function myFunc($params = array('name' => 'rob', 'count' => 5, 'anArray' => array('A string', 5, myObject)))
{
    // ...
}

Bu Argc / argv kullanmaya benzer, ama okumak için biraz daha kolay sanırım. Herkes bu yöntemi artılarını ve eksilerini bir listesi var ya bu en iyi uygulamaları üzerinde yazılı olan herkes biliyor mu? Ben sadece Googling denedim ama "parametrelerinin ilişkisel dizi" hemen hemen şimdiye kadar yazılmış her programlama makale kadar getiriyor.

Ayrıca, parametreleri bu şekilde geçen bir terim bile var?

5 Cevap

Bu anahtar kelime argümanları kullanarak bir öykünme. Python, örneğin, size söyleyebilirim:

myFunc(name="bob", age=10, gender="male")

PHP bu sözdizimi desteklemiyor yana, ilişkisel diziler sonraki en iyi şey vardır.

Adlandırılmış parametreleri kullanarak bir dezavantajı PHPDoc ile parametreleri belgelemektedir. Birçok editörler / IDE kodunuzu ayrıştırmak ve genel bilgilendirme kısmı üretebilirsiniz "otomatik" belgeleri sağlar.

örneğin

function foo(array $bar, SomeClass $stuff) { returns $magic; }

üretecektir:

/**
 * foo
 *
 * @param array $bar
 * @param SomeClass $stuff
 * @return mixed
 */
function foo(array $bar, SomeClass $stuff) { returns $magic; }

Bir $ params dizisi tüm parametreleri koyarsanız, sadece gibi görünecektir

/**
 * foo
 *
 * @param array $params
 * @return mixed
 */

Ayrıca her bir parametre için fazladan kod yazmak zorunda için geliştiriciler için ek yükün bir çok ekler. Ben iki yaklaşımın bir karışımını kullanarak öneririm.

örneğin If you had a function to return an HTML text input element you could have the following method signature:

/**
 * formText
 *
 * @param string $name name of text element
 * @param string $value value of text element
 * @param array $options additional options for text element
 * @return string
 */
function formText($name, $value, $options = array());

Böylece, kolayca işlevine en ortak değerleri geçebilir.

$this->formText('foo', 'Default...');

ek, daha az yaygın params'ı gerekiyorsa ve uygun adlandırılmış parametre sözdizimini kullanmak istiyorum:

$this->formText('foo', 'Default...', array(
    'class' => 'bold highlighted'
));

Aksi takdirde, yazdığınız olurdu sadece jenerik $ params dizisini kullanarak:

$this->formText(array(
    'name' => 'foo',
    'value' => 'Default...'
));

Diğer yüksek seviyeli diller destek işlevleri ve yöntemleri named parameters . Örneğin, Python size çağırabilirsiniz:

my_func(name='rob', count=5, an_array=['A string', 5, my_object])

Ne görüyorsanız PHP bu davranışını simüle etmek için bir girişimdir. Yararları açıktır.

  • Esneklik
  • Beklenen parametrelerin sırası / sayısını bilmek gerek

Bir sakıncaları bir karma tablo arama her yöntem çağrısı için gerekli olduğunu olabilir, ama argümanlar PHP nasıl ele bağlı olarak, performans isabet önemsiz olabilir.

Bu PHP named parameters yapmak için tek yoldur.

Eğer IMO, argüman bir çok sayıda var sadece yararlıdır. Aksi açıkça tanımlanmış bir argüman imzanın faydaları bir "intellisense" yetenekli bir IDE kullanmak, özellikle de iyi bir seçimdir.

Bu teknik (tuşlarıyla olarak dize kullanırken JS, sen değil, diziler nesneleri kullanıyorsanız,) (gerçekten) genellikle nesnelerle, Javascript kullanılır; bir örnek için bkz scriptaculous Draggable.

Şimdi, artılarını ve anında akla gelen eksilerini bir çift için:

  • pro : you can use any number of parameters you want, and still have them named
    • ve hiçbir "listenin sonunda sadece parametreler optionnal vardır" var
  • con: phpdoc iyi değil: sadece tek bir parametre var gibi görünüyor ve ne yaptığını çok gösterge yok
  • con (bir öncekinin sonucu): Eğer kod ipuçları ile bir IDE kullanırken, her parametre için adları / açıklamasını görüntülemek olamaz: her zaman belgelerini kontrol etmek zorunda.

O tek "con" benim için yeterli: başka hiçbir (reallistic) bir yolu varsa ben sadece parametreleri geçirerek bu şekilde kullanın.