2012-03-02 23 views
6

Olası Çoğalt görmezden:
Any way to specify optional parameter values in PHP?
PHP fonksiyonu - bazı varsayılan parametreleri

sadece rastgele bu rastladı. Ben bir işlev şöyle varsa

:

public function getSomething($orderBy='x', $direction = 'DESC', $limit=null){ 

//do something random 

} 

işlevini çağırarak zaman mümkün ilk iki alanı görmezden gelip onları henüz varsayılan 3rd belirtmek bırakmaktır. Örneğin

:

$random = $this->my_model->getSomething(USE_DEFAULT, USE_DEFAULT, 10); 

Ben 1. ve 2. parametreleri ancak geçebilir biliyorum sadece varsayılan değeri kullanmak diyor özel anahtar kelime çeşit onların ise tüm im soruyor olduğunu.

Bunun mantıklı olmasını umuyorum. onun bir problem değil, sadece meraklı. Sen params görmezden gelemeyiz

+0

Girişiniz için herkese teşekkürler :) – fl3x7

+0

İşlevleri çağırırken varsayılan parametreyi yoksa veya https://github.com/topclaudy/php-syntactic – cjdaniel

cevap

11

Kendin Buna gerek görüyoruz.

public function getSomething($orderBy = null, $direction = null, $limit = null) { 
    // fallbacks 
    if ($orderBy === null) $orderBy = 'x'; 
    if ($direction === null) $direction = 'DESC'; 

    // do something random 
} 

Eğer varsayılan kullanmak istediğinizi belirtmek için çağrılırken Sonra null geçmesi:

$random = $this->my_model->getSomething(null, null, 10); 

Başka bir olası çözüm Bir varsayılan değer kullanılması gerektiğini belirtmek için null kullanabilirsiniz Bazen tüm isteğe bağlı parametreleri içeren parametre listesinin en sonundaki ek bir parametredir:

public function foo($options = array()) { 
    // merge with defaults 
    $options = array_merge(array(
     'orderBy' => 'x', 
     'direction' => 'DESC', 
     'limit'  => null 
    ), $options); 

    // do stuff 
} 

Bu şekilde, isteğe bağlı tüm bağımsız değişkenleri belirtmeniz gerekmez. array_merge(), her zaman eksiksiz bir dizi seçenekle uğraşmanızı sağlar. Böyle kullanmak olacaktır:

public function foo($someRequiredParameter, $someOtherRequiredParameter, $options = array()) { 
    // ... 
} 
+0

Sözdizimsel bu konuda zarif bir yaklaşım sunuyor. Buradan kontrol edin https://github.com/topclaudy/php-syntactic – cjdaniel

-2

okumak için

teşekkürler. Ama bu gibi şeyler yapabiliriz:

public function getSomething($limit=null){ 

return $this->getSomething('x','DESC',$limit); 

} 


public function getSomething($orderBy='x', $direction = 'DESC', $limit=null){ 

... 

} 

ya

+2

Hayır, sözdizimi yapamıyorsanız Syntactic'i kullanabilirsiniz. PHP aşırı yüklemeyi desteklemiyor. – jwueller

0

I: orada bu özel durum hiç gerekli bir parametredir ancak Eğer bir ihtiyaç varsa, basitçe isteğe bağlı olanların önüne eklemek gibi

$random = $this->my_model->foo(array('limit' => 10)); 

görünüyor PHP'nin bunu yapabileceğini düşünmeyin. Bildiğim en iyi çözüm burada özetlenmiştir: fonksiyonlar çok fazla yapmaya çalışırken http://www.php.net/manual/en/functions.arguments.php#70511

1

Dürüst olmak gerekirse, bu bir sorun haline gelir. Bir fonksiyonun birkaç parametreden daha fazla büyüdüğünü gördüğünüzde neredeyse her zaman daha iyi bir tasarım kalıbı vardır (genellikle eski kodu devralan fakir adamdır ve parametrelerin eklenmesi, "işi bitirmek" için bu en hızlı yoldur).

zor cevabı en iyi sorunuza göre, ancak cyclomatic karmaşıklığı göz atın: http://en.wikipedia.org/wiki/Cyclomatic_complexity

Bu az sorunuzu yapar işlevi çok fazla yapıyor olmadığını bilmek iyi bir yoldur sorun şu an muhtemelen.

+0

Tam olarak. Herkesin karmaşıklığını akılda tutması gerekir. 1! – jwueller

+0

Bunun için teşekkürler. Bunu okuyacak :) – fl3x7