传递变量作为方法的参考

时间:2013-12-19 06:50:05

标签: php methods reference laravel-4

所以我有这个功能

public static function variable( &$var )
{ 
    if( isset($var) )
    {
        return $var; 
    }
    return false;

}

我想给它一个变量/ array [key],如果键不存在,则返回false而不是错误。

我正在使用laravel 4.它作为一个函数工作正常,如果我创建一个类Helpers并从app文件夹中的库文件夹自动加载它我可以通过Helpers :: variable访问它并且它工作正常。

// those two work fine
<?php
class Helpers {
    public static function variable( &$var ){
        return isset($var) ? $var : false;
    }
}

function variable( &$var ){
    return isset($var) ? $var : false;
}

但是,如果我创建一个包(与作曲家一起使用,会有更多功能,所以我想在这里)https://github.com/lukasoppermann/php-utilities我收到错误

我使用$test is undefined

Utilities::variable($test)。 $ test当然是未定义的,但是使用其他两个函数/方法,它按预期工作,我得到错误,没有错误。

知道为什么我这样吗?我正在使用Facades并且该类有一个命名空间,这是一个问题吗?

2 个答案:

答案 0 :(得分:1)

如果将变量传递给函数,则必须先定义它。周围没有办法(至少我不知道)。如果您只使用isset($test),您可能想知道它为什么会起作用。那是因为isset()empty()是语言结构而不是功能。

来自kunststube.net/isset

  

isset和empty实际上不是常规函数,而是语言结构。这意味着它们是PHP语言本身的一部分,不遵循正常的函数规则,因此可以避免因不存在的变量而触发错误。

如果你想检查数组中是否存在某个键,array_key_exists可能比isset更好。

修改

我现在看到啊。这确实是Facades的一个问题。根据Gustek的回答,通过引用传递变量,创建变量(如果它是未定义的)。这就是你的前两种方法正常工作的原因。但是,使用Facade,您不会直接调用静态方法,而是通过其他层调用静态方法。而且这个人通过价值接受你的论证而不是参考。

// See: Illuminate\Support\Facades
public static function __callStatic($method, $args)
{
    $instance = static::resolveFacadeInstance(static::getFacadeAccessor());

    switch (count($args))
    {
        case 0:
            return $instance->$method();

        case 1:
            return $instance->$method($args[0]);

        case 2:
            return $instance->$method($args[0], $args[1]);

        case 3:
            return $instance->$method($args[0], $args[1], $args[2]);

        case 4:
            return $instance->$method($args[0], $args[1], $args[2], $args[3]);

        default:
            return call_user_func_array(array($instance, $method), $args);
    }
}

来自php.net

  

注意:   这些魔术方法的所有参数都不能通过引用传递。

答案 1 :(得分:0)

在PHP中,当您尝试使用未分配任何值的变量之前收到NOTICE错误并且使用NULL值创建变量(isset对于null返回false)

在您的情况下会出现相同的错误,但是当您尝试引用未定义的变量时,它会在没有错误的情况下创建,似乎是故意这样做的。你可以阅读它in documentation(2nd note)

更好的问题是他们为什么这样做。