php: 编写 isset 函数,其中 returns 值为或 null
php: write isset function which returns value or null
我在项目周围的许多地方(数千个地方)都有以下代码:
$foo = isset($mixed) ? $mixed : null;
其中$mixed
可以是任何东西:数组、数组元素、对象、对象属性、标量等。例如:
$foo = isset($array['element']) ? $array['element'] : null;
$foo = isset($nestedArray['element']['key']) ? $nestedArray['element']['key'] : null;
$foo = isset($object->prop) ? $object->prop : null;
$foo = isset($object->chain->of->props) ? $object->chain->of->props : null;
有没有办法把这个重复的逻辑写成一个(简单的)函数?例如,我试过:
function myIsset($mixed)
{
return isset($mixed) ? $mixed : null;
}
上面的函数看似可行,但实际上行不通。例如,如果 $object->prop
不存在,而我调用 myIsset($object->prop))
,那么在函数被调用之前我会得到致命错误:Undefined property: Object::$prop
。
关于如何编写这样的函数有什么想法吗?有可能吗?
我知道发布了一些解决方案 here and here,但这些解决方案仅适用于数组。
你实际上可以这样写:
$foo = $mixed?:null;
如果您只想检查它是否存在,请执行此操作
function myIsset($mixed)
{
return isset($mixed); // this is a boolean so it will return true or false
}
isset
是一种语言构造,而不是常规函数。因此,它可以采用否则会导致错误的内容,并且只是 return false.
当您调用 myIsset($object->prop))
时,会发生计算并出现错误。
见http://php.net/manual/en/function.isset.php
这与在 JavaScript 中使用 typeof nonExistentVariable
的问题相同。 typeof
是一种语言结构,不会导致错误。
但是,如果您尝试创建函数,则会收到尝试使用未定义变量的错误。
function isDef(val) {
return typeof val !== 'undefined';
}
console.log( typeof nonExistent !== 'undefined'); // This is OK, returns false
isDef(nonExistent); // Error nonExistent is not defined
我在阅读 php references 时偶然发现了我自己的问题的答案。我的解决方法如下:
function issetValueNull(&$mixed)
{
return (isset($mixed)) ? $mixed : null;
}
此函数的调用现在如下所示:
$foo = issetValueNull($array['element']);
$foo = issetValueNull($nestedArray['element']['key']);
$foo = issetValueNull($object->prop);
$foo = issetValueNull($object->chain->of->props);
希望这对寻找类似解决方案的任何人有所帮助。
function f(&$v)
{
$r = null;
if (isset($v)) {
$r = $v;
}
return $r;
}
PHP 7 有一个新的 "Null coalescing operator" 正是这样做的。是双??如:
$foo = $mixed ?? null;
我在项目周围的许多地方(数千个地方)都有以下代码:
$foo = isset($mixed) ? $mixed : null;
其中$mixed
可以是任何东西:数组、数组元素、对象、对象属性、标量等。例如:
$foo = isset($array['element']) ? $array['element'] : null;
$foo = isset($nestedArray['element']['key']) ? $nestedArray['element']['key'] : null;
$foo = isset($object->prop) ? $object->prop : null;
$foo = isset($object->chain->of->props) ? $object->chain->of->props : null;
有没有办法把这个重复的逻辑写成一个(简单的)函数?例如,我试过:
function myIsset($mixed)
{
return isset($mixed) ? $mixed : null;
}
上面的函数看似可行,但实际上行不通。例如,如果 $object->prop
不存在,而我调用 myIsset($object->prop))
,那么在函数被调用之前我会得到致命错误:Undefined property: Object::$prop
。
关于如何编写这样的函数有什么想法吗?有可能吗?
我知道发布了一些解决方案 here and here,但这些解决方案仅适用于数组。
你实际上可以这样写:
$foo = $mixed?:null;
如果您只想检查它是否存在,请执行此操作
function myIsset($mixed)
{
return isset($mixed); // this is a boolean so it will return true or false
}
isset
是一种语言构造,而不是常规函数。因此,它可以采用否则会导致错误的内容,并且只是 return false.
当您调用 myIsset($object->prop))
时,会发生计算并出现错误。
见http://php.net/manual/en/function.isset.php
这与在 JavaScript 中使用 typeof nonExistentVariable
的问题相同。 typeof
是一种语言结构,不会导致错误。
但是,如果您尝试创建函数,则会收到尝试使用未定义变量的错误。
function isDef(val) {
return typeof val !== 'undefined';
}
console.log( typeof nonExistent !== 'undefined'); // This is OK, returns false
isDef(nonExistent); // Error nonExistent is not defined
我在阅读 php references 时偶然发现了我自己的问题的答案。我的解决方法如下:
function issetValueNull(&$mixed)
{
return (isset($mixed)) ? $mixed : null;
}
此函数的调用现在如下所示:
$foo = issetValueNull($array['element']);
$foo = issetValueNull($nestedArray['element']['key']);
$foo = issetValueNull($object->prop);
$foo = issetValueNull($object->chain->of->props);
希望这对寻找类似解决方案的任何人有所帮助。
function f(&$v)
{
$r = null;
if (isset($v)) {
$r = $v;
}
return $r;
}
PHP 7 有一个新的 "Null coalescing operator" 正是这样做的。是双??如:
$foo = $mixed ?? null;