【问题标题】:Passing variable as reference to method传递变量作为方法的引用
【发布时间】:2013-12-19 06:50:05
【问题描述】:

所以我有这个功能

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;
}

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

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

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

【问题讨论】:

    标签: php methods reference laravel-4


    【解决方案1】:

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

    来自kunststube.net/isset

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

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

    编辑:

    啊,我现在明白了。这确实是外墙的问题。根据 Gustek 的回答,通过引用传递变量会创建变量(如果未定义)。这就是为什么您的前两种方法可以正常工作的原因。但是,使用 Facades,您不会直接调用静态方法,而是通过另一层调用。而这个是通过价值而不是参考来接收你的论点。

    // 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

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

    【讨论】:

    • 但是为什么它可以与正常功能一起使用?和 Helper 方法? (在顶部编辑)
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-02
      • 2018-10-31
      相关资源
      最近更新 更多