PHP tarafından başvuru parametreleri ve varsayılan boş

5 Cevap php

Kullanıcının bizim gibi bir yöntem imzası var diyelim

public static function explodeDn($dn, array &$keys = null, array &$vals = null,
    $caseFold = self::ATTR_CASEFOLD_NONE)

kolayca sonra tüm parametreleri atlayarak yöntemini çağırın $dn yapabilirsiniz:

$dn=Zend_Ldap_Dn::explodeDn('CN=Alice Baker,CN=Users,DC=example,DC=com');

Biz de 3 parametreleri ile yöntemini çağırabilirsiniz:

$dn=Zend_Ldap_Dn::explodeDn('CN=Alice Baker,CN=Users,DC=example,DC=com', $k, $v);

ve 4 parametrelerle:

$dn=Zend_Ldap_Dn::explodeDn('CN=Alice Baker,CN=Users,DC=example,DC=com', $k, $v, 
    Zend_Ldap_Dn::ATTR_CASEFOLD_UPPER);

Ama neden, örneğin, aşağıdaki parametre kombinasyonu ile yöntemini çağırmak mümkün değildir:

$dn=Zend_Ldap_Dn::explodeDn('CN=Alice Baker,CN=Users,DC=example,DC=com', $k, null, 
    Zend_Ldap_Dn::ATTR_CASEFOLD_UPPER);
$dn=Zend_Ldap_Dn::explodeDn('CN=Alice Baker,CN=Users,DC=example,DC=com', null, $v);

Yöntemine null geçen ve varsayılan değer güvenerek arasındaki fark nedir? Bu kısıt kılavuzda yazılı mı? Bu atlatılabilmişlerdir?

5 Cevap

Null bir başvuru olamaz çünkü.

Null içeren bir değişken için bir referans olabilir - yani varsayılan değer tam olarak ne olduğunu. Ya da bir değişmez değer olarak null geçirebilirsiniz - ancak bir out parametresi istiyorum çünkü bu burada mümkün değildir.

Açıkça NULL geçmek isterseniz by-ref argümanlar için bir kukla değişken oluşturmak gerekir iken, ayrı bir satırda bu değişken oluşturmak zorunda değilsiniz. Doğrudan bir işlev argüman olarak $ kukla = null gibi bir atama ifadeyi kullanabilirsiniz:

function foo (&$ref = NULL) {

    if (is_null($ref)) $ref="bar";
    echo "$ref\n";        
}

foo($dummy = NULL); //this works!

Ben sadece kendimi buldum, ve ben oldukça şok o_O değilim!

Bu PHP documentation diyor ki:

function makecoffee($type = "cappuccino")
{
    return "Making a cup of $type.\n";
}
echo makecoffee(); // returns "Making a cup of cappuccino."
echo makecoffee(null); // returns "Making a cup of ."
echo makecoffee("espresso"); // returns "Making a cup of espresso."

I would have expected makecoffee(null) to return "Making a cup of cappuccino.". One work-around I have used is to check inside the function if the argument is null:

function makecoffee($type = null)
{
    if (is_null($type)){ 
       $type = "capuccino";
    }
    return "Making a cup of $type.\n";
}

Şimdi makecoffee(null) döner "orta şekerli bir fincan yapma."

(Bu aslında Zend ilgili soruyu çözmek değil farkında, ancak bazı yararlı olabilir ...)

@ Tomalak

Aslında, varsayılan değer ilgili herhangi bir başvuru olmadan bir değişken oluşturur. Hangi şey geçerken sadece başlaması edilemez bir şeydir.

Ne ben nedenlerini göstermek bulmak Aşağıdaki örnek (i test etmedi ki) olduğu:

function foo (&$ref = NULL) {
  $args = func_get_args();
  echo var_export($ref, TRUE).' - '.var_export($args, TRUE);
}
$bar = NULL;
foo();     // NULL - array()
foo($bar); // NULL - array(0 => NULL)

In my opinion, PHP should offer a way to NOT pass certain parameters, like with
foo($p1, , , $p4); or similar syntax instead of passing NULL.
But it doesn't, so you have to use dummy variables.

Sadece onaylamak ne Tomalak ifade here:

Aşağıdaki işler:

$k=array();
$v=null;
$dn=Zend_Ldap_Dn::explodeDn('CN=Alice Baker,CN=Users,DC=example,DC=com', $k, $v, 
    Zend_Ldap_Dn::ATTR_CASEFOLD_UPPER);

Güzel değil - ama açıklama açık ve anlaşılabilir.