PHP isteğe bağlı parametre değerleri belirtmek için herhangi bir şekilde?

9 Cevap php

Diyelim ki bir PHP fonksiyonu foo var diyelim:

function foo($firstName = 'john', $lastName = 'doe') {
    echo $firstName . " " . $lastName;
}
// foo(); --> john doe

Sadece ikinci isteğe bağlı parametre belirtmek için herhangi bir yolu var mı?

Örnek:

foo($lastName='smith'); // output: john smith

9 Cevap

PHP bizatihi fonksiyonları için adlandırılmış parametreleri desteklemiyor. Ancak, bu aşmanın bazı yolları vardır:

  1. Fonksiyonu için tek argüman olarak bir dizi kullanın. Sonra diziden değerleri indirebiliriz. Bu dizide isimli değişkenler kullanılarak sağlar.
  2. Bağlama göre argümanları isteğe bağlı sayıda izin vermek istiyorsanız, o zaman daha çok işlev tanımında geçerli parametrelerini belirlemek yerine func_num_args ve func_get_args kullanabilirsiniz. Sonra argüman sayısının, dize uzunlukları, vb dayalı ne yapacağını belirleyebilirsiniz.
  3. Eğer belirtmek istemediğiniz argüman null değeri iletin. Gerçekten dolaşmakta, ama çalışıyor değil.
  4. Eğer bir nesne bağlamda çalışıyorsanız ne argümanları dayalı özel yöntemlere yol kabul edilmiştir böylece, o zaman istekleri bu tür işlemek için sihirli yöntem __ çağrısı () kullanabilirsiniz.

Varsayılan değerler daha kolay ayarı sağlar dizi tekniğin bir varyasyonu:

function foo($arguments) {
  $defaults = array(
    'firstName' => 'john',
    'lastName' => 'doe',
  );

  $arguments = array_merge($defaults, $arguments);

  echo $arguments['firstName'] . ' ' . $arguments['lastName'];
}

Kullanımı:

foo(array('lastName' => 'smith')); // output: john smith

Sen biraz kodunuzu refactor olabilir:

function foo($firstName = NULL, $lastName = NULL)
{
    if (is_null($firstName))
    {
        $firstName = 'john';
    }
    if (is_null($lastName ))
    {
        $lastName = 'doe';
    }

    echo $firstName . " " . $lastName;
}

foo(); // john doe
foo('bill'); // bill doe
foo(NULL,'smith'); // john smith
foo('bill','smith'); // bill smith

Birden fazla isteğe bağlı parametreleri varsa, bir çözüm, bir karma-dizi olan tek bir parametre geçmek için:

function foo(array $params = array()) {
    echo $params['firstName'] . " " . $params['lastName'];
}

foo(array('lastName'=>'smith'));

Tabii ki bu çözüm de hash dizinin alanları mevcut veya doğru yazıldığından olduğuna dair hiçbir doğrulama yok. Bu doğrulamak için tüm size kalmış.

Hayır Bunu yapmanın olağan yolu vb dize uzunluğu, yazarak, gibi ima hangi parametre belirlemek için bazı sezgisel tarama, ile

Genel anlamda, en az gerekli için gerekli çoğu sırayla parametreleri almak için fonksiyon yazmak istiyorum.

İstediğiniz yolu: hayır.

NULL bu değer verilir verilmez nota gibi, bazı özel işaretini kullanabilirsiniz:

function foo($firstName, $lastName = 'doe') {
    if (is_null($firstName))
        $firstName = 'john';
    echo $firstName . " " . $lastName;
}

foo(null, 'smith');

Ne yazık ki ne yapmaya çalışıyoruz bunu yaparken hiç "sözdizimsel şeker" bir yolu vardır. Hepsi WTF biçimleri değişen ediyoruz.

Eğer keyfi parametre tanımlanmamış bir dizi alır bir işlevi ihtiyacınız varsa,

function foo () { 
     $args = func_get_args(); 
     # $args = arguments in order 
}

Hile yapmak olacaktır. Php için bu büyülü tarafında biraz, çünkü çok fazla kullanmaktan kaçının deneyin.

Daha sonra isteğe bağlı varsayılan uygulamak ve parametre sayısı dayalı garip şeyler yapabilirdi.

function foo(){ 
   $args = func_get_args();
   if( count($args) < 1 ){ 
       return "John Smith"; 
   }
   if( count($args) < 2 ) { 
       return "John " .$args[0];
   }
   return $args[0] . " " . $args[1];
}

Ayrıca, isteğe bağlı Perl tarzı parametrelerini taklit olabilir,

function params_collect( $arglist ){ 
    $config = array();
    for( $i = 0; $i < count($arglist); $i+=2 ){ 
       $config[$i] = $config[$i+1];
    }
    return $config; 
}
function param_default( $config, $param, $default ){ 
    if( !isset( $config[$param] ) ){ 
           $config[$param] = $default;
    }
    return $config;
}

function foo(){ 
   $args = func_get_args();
   $config = params_collect( $args ); 
   $config = param_default( $config, 'firstname' , 'John' ); 
   $config = param_default( $config, 'lastname' ,  'Smith' ); 
   return $config['firstname'] . '  ' . $config['lastname'];   
}

foo( 'firstname' , 'john', 'lastname' , 'bob' ); 
foo( 'lastname' , 'bob', 'firstname', 'bob' ); 
foo( 'firstname' , 'smith'); 
foo( 'lastname', 'john' );

Tabii ki, bu would Burada bir dizi argüman kullanmak daha kolay olabilir, ancak seçim şeyin (hatta kötü yolları) için izin verilen konum.

notedly, this is nicer in Perl because you can do just foo( firstname => 'john' );

Burada bahsedilen birkaç 'seçenekleri' tarzı uygulamaları vardır. Eğer standart olarak bunları kullanmayı planlıyorsanız Hiçbiri şimdiye kadar çok kurşun geçirmez. Bu desen deneyin:

function some_func($required_parameter, &$optional_reference_parameter = null, $options = null) {
    $options_default = array(
        'foo' => null,
    );
    extract($options ? array_intersect_key($options, $options_default) + $options_default : $options_default);
    unset($options, $options_default);

    //do stuff like
    if ($foo !== null) {
        bar();
    }
}

Bu size (bu örnekte sadece $foo) değişkenleri yerel işlev ve bir varsayılan olmayan herhangi bir değişken yaratmak engeller. Bu yüzden kimse yanlışlıkla fonksiyon içinde diğer parametreleri veya diğer değişkenleri üzerine yazabilirsiniz olduğunu.

Hayır yok ama bir dizi kullanabilirsiniz:

function foo ($nameArray) {
    // Work out which values are missing?
    echo $nameArray['firstName'] . " " . $nameArray['lastName'];
}

foo(array('lastName'=>'smith'));