所以我有这个功能
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并且该类有一个命名空间,这是一个问题吗?
答案 0 :(得分:1)
如果将变量传递给函数,则必须先定义它。周围没有办法(至少我不知道)。如果您只使用isset($test)
,您可能想知道它为什么会起作用。那是因为isset()
和empty()
是语言结构而不是功能。
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)
更好的问题是他们为什么这样做。