PHP Ruby gibi dizi argümanlar uygulama

6 Cevap php

Ben mostrly PHP programlama ve Ruby bazen (bir HTML seçin yardımcı, diyelim ki, gibi) benim PHP funcions içine bu "hash argümanlar" uygulayan bir şekilde muhtaç olmak ne

draw_select :name => :id, :onclick => 'alert(this.value)'

PHP sorun ben pek olası özelliklerini uygulamak için bir parametre sırasını tanımlamak zorunda olduğunu ifade etti.

Ben sadece 1 dize argümanı tanımlamak ve json_decode kullanın () bu yüzden bu gibi argümanlar geçebilir düşünüyordum:

draw_select("'name': 'id', 'onclick': 'alert(this.value)' ")

aşağıdaki gibi bir tanım olur:

function draw_select($string) {
// use json_decode here and pass them as variables
}

Bunu yapmak için daha akıllı bir yol .. bildiğiniz veya PHP bu kadar triying aslında hiç bir mantıklı olmadığını düşünüyor musunuz?

Edited to add: I'm looking for a 'alternative' alternative to just pass a signle array as an argument like function(array(...))

6 Cevap

PHP kesinlikle bu açıdan bazı şeker yoksundur. Ben de Python bir sürü yapmak ve PHP kullanarak zaman pahalıya isimli değişkenler özledim. PHP ile, ancak, ben bir işlevi var zaman ben sadece bir ya da iki / önemli argüman kabul çok sayıda seçenek ve geri kalanı için bir dizi kabul etmek gerekir ki:

function draw_select($name, $options = array(), $html_options = array()) {

}

Bu CodeIgniter ve CakePHP gibi kütüphaneler aynı <select> senaryo işlemek yoludur.

PHP'nin ilişkilendirilebilir diziler çok güçlü olduğunda Şahsen, bu durumda JSON kullanarak gerçek bir fayda getirir. Sadece dil verir ne sopa, ve bu PHP ile bunu yapmak için bir yoldur.

Neden yerine bir dizi geçemez?

draw_select(array(
  'name'=> 'id', 
  'onclick'=> 'alert(this.value)'
));

Ve PHP 5.3 dahil olmak üzere PHP herhangi bir sürümünde bunu yapmak için hiçbir 1 yolu var.

PHP adlandırılmış parametreleri ve / veya smalltalk / nesnel-c / yakut tarzı seçiciler için destek yok. PHP ya dilinin bu bölümü yeniden tanımlamak için bir yol sunmuyor. PHP bu isterseniz şans bitti. PHP sözde "meta-programlama" için en iyi dil seçim olmamıştı.

Diğerleri de söylediğim gibi, PHP ile en iyi bahis ekstresi ile birlikte anahtar / değer çiftleri olan bir dizi kullanmaktır.

myFunction(array(
    'theThing'=>0,
    'param2'=>'another value',
));

function myFunction($params){
    extract($params);
    echo $param2;
}
  1. Muhtemelen bu yeteneği ile PHP genişletmek için C / C + + bir uzantısı yazabilirsiniz, ama bir mazoşist olurdu. :)

Burada tüm seçenekler array çağırıyor ve bu şeyler yapmanın "PHPish" yol gibi görünüyor dahil beri, ben bunu her zaman yapıyoruz belki de mantıklı o atarım array() için takma ad bir işlev z() (ben sadece jQuery $() çizgisinde düşünüyorum) var. Isim dizinin uzunluğu yanında, ben Ruby sürümü herhangi daha şık nasıl görmüyorum. Orada daha az karakter, ama ben biraz dislike, hemen bir fonksiyon parametre ve bu örnek kodda bir anahtar / değer çifti arasındaki farkı söyleyemem.

Bir çözüm değişken argümanları kullanmaktır.

Bazen doğal ilişkilendirilebilir diziler desteklemeyen dil ile kullanabilirsiniz.

function AssociativeArrayFromFlatArray($args)
{
    $nbArgs = count($args);
    if( $nbArgs % 2 != 0 )
    {
    	die('This function must have an even number of arguments');
    }

    $ret = array();
    for( $i = 0; $i < $nbArgs; $i += 2 )
    {
    	$key = $args[$i];
    	$value = $args[$i + 1];
    	$ret[$key] = $value;
    }
    return $ret;
}

function DoSomething(/*...*/)
{
    $args = AssociativeArrayFromFlatArray(func_get_args());

    if( $args['action'] == 'greet' )
    {
    	$count = $args['count'] or 1;
    	for( $i = 0; $i < $count; $i += 1 )
    	{
    		echo $args['text'];
    	}
    }
}

DoSomething('action', 'greet', 'count', 10, 'text', 'Hello World! ');

Bu da doğal olarak ilişkilendirilebilir diziler destekler beri PHP için bu kullanmak için bir utanç olsa ...

Sen 'func_get_args()' işlevini kullanmak ve sadece var adı ve değer olarak her saniye kadar her ilk parametreyi kullanabilirsiniz. O (Seni diziler için Ruby'nin zarif çözüm konusunda tam olarak ne demek anlamak, bunu yapmak için bir yol üzerinde yaş arıyordum) muhtemelen sizin yakut yol almak olacak kadar yakındır. Umarım gelecekte PHP o yakut gibi yürütme üzerinde yeniden programlanması kadar kendini öyle açılır can (aslında ne denir biliyorum, ama o kadar parlak raylar üzerinde yakut ve yakut kılan yok) olmak.