7.0 之前的 PHP 中的后期静态绑定和 isset
Late static binding & isset in PHP prior 7.0
以下代码在 PHP 7.0 及更高版本上按预期工作:
class foo {
const BLAH = [];
public function bar() {
return isset(static::BLAH['baz']);
}
}
var_dump((new foo)->bar());
而 PHP 5.6 只给出:
Fatal error: Cannot use isset() on the result of an expression (you can use "null !== expression" instead)
按照建议更改代码会导致通知(这是预期的):
Notice: Undefined index: baz
这可行:
class foo {
const BLAH = [];
public function bar() {
return null !== static::BLAH['baz'];
}
}
var_dump(@(new foo)->bar());
有没有不以通知结尾的替代方案,没有在调用前加上 @
前缀?
您可以改用 array_key_exists
,它应该可以在 PHP5 上正常工作。
return array_key_exists('baz', static::BLAH);
请注意,与 isset
的细微差别是,如果定义了 static::BLAH['baz']
,array_key_exists
将始终 return true
,而 isset
将 return false
如果已定义但其值为 null
.
以下代码在 PHP 7.0 及更高版本上按预期工作:
class foo {
const BLAH = [];
public function bar() {
return isset(static::BLAH['baz']);
}
}
var_dump((new foo)->bar());
而 PHP 5.6 只给出:
Fatal error: Cannot use isset() on the result of an expression (you can use "null !== expression" instead)
按照建议更改代码会导致通知(这是预期的):
Notice: Undefined index: baz
这可行:
class foo {
const BLAH = [];
public function bar() {
return null !== static::BLAH['baz'];
}
}
var_dump(@(new foo)->bar());
有没有不以通知结尾的替代方案,没有在调用前加上 @
前缀?
您可以改用 array_key_exists
,它应该可以在 PHP5 上正常工作。
return array_key_exists('baz', static::BLAH);
请注意,与 isset
的细微差别是,如果定义了 static::BLAH['baz']
,array_key_exists
将始终 return true
,而 isset
将 return false
如果已定义但其值为 null
.