当前位置:  开发笔记 > 编程语言 > 正文

PHP by-reference参数和默认null

如何解决《PHPby-reference参数和默认null》经验,为你挑选了3个好方法。

假设我们有一个类似的方法签名

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

我们可以通过以下方式省略所有参数来轻松调用该方法$dn:

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

我们也可以用3个参数调用该方法:

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

并有4个参数:

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

但是为什么不可能使用以下参数组合调用该方法,例如:

$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);

传递null给方法和依赖默认值之间有什么区别?这个约束是否写在手册中?它可以被规避吗?



1> Tomalak..:

这是因为你不能引用null.

您可以引用包含null的变量 - 这正是默认值所做的.或者你可以传入null作为文字值 - 但是因为你想要一个out参数,所以这里不可能.



2> 小智..:

如果要显式传递NULL,则必须为by-ref参数创建虚拟变量,而不必在单独的行上创建该变量.您可以直接使用$ dummy = NULL之类的赋值表达式作为函数参数:

function foo (&$ref = NULL) {

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

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


这给了我严格的模式警告:`PHP严格标准:只有变量应该在第9行的(snip)/test.php中通过引用传递.

3> Rafa..:

我自己发现了这个,我很震惊o_O!

这是PHP文档所说的:

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."

我原本期望makecoffee(null)回归"制作一杯卡布奇诺咖啡".我使用的一种解决方法是在函数内部检查参数是否为null:

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

现在makecoffee(null)返回"制作一杯卡布奇诺咖啡".

(我意识到这实际上并没有解决与Zend相关的问题,但它可能对某些人有用...)

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有