之前我曾问question,基本上将$null = null
方法作为给定,在PHP中返回空引用。
无论如何,如果不清楚的话;在PHP中通过引用从函数返回null
的方式是什么(其他,如果有的话)?我特别要求返回null引用,而不是关于解释我链接问题的三元运算符问题。
例如:
function &return_null(){
return null;
}
$null_ref = return_null(); // fails
然而:
function &return_null(){
$null = null;
return $null;
}
$null_ref = return_null(); // succeeds
我问,因为我在创建可重用库时有点强迫症;我真的很喜欢干净的代码,但是它很干净,它可以使用给定的语言。使用占位符$null = null
可以让我的皮肤爬行,尽管它实现了所需的功能。
为了完整性@ yes123,这是问题所在的方法片段:
public static function &getByPath(Array &$array, $path, $delimiter){
if(!is_array($path)){
$path = explode($delimiter, $path);
}
$null = null;
while(!empty($path)){
$key = array_shift($path);
if(!isset($array[$key])){
return $null;
}
if(!empty($path) && !is_array($array[$key])){
return $null;
}
$array = &$array[$key];
}
return $array;
}
此setByPath()
课程中还有issetByPath()
,unsetByPath()
和ArrayPath
。我已经使用重载魔法别名这些静态方法。构造实例时,会将数组传递给构造函数(以及分隔符),而魔术方法使用引用的实例数组调用静态方法。到目前为止它的工作非常好。另外,我编写了一个只返回实例的别名函数array_path()
。例如,人们可以这样做:
$array = array(
'foo' => array(
'bar' => array(
'hello' => 'world',
),
),
);
array_path($array, '/')->{'foo/bar/hello'} = 'universe';
var_dump($array);
/*
array(1) {
["foo"]=>
array(1) {
["bar"]=>
array(1) {
["hello"]=>
string(8) "universe"
}
}
}
*/
答案 0 :(得分:3)
我对我的代码也有点肛门。这里没有功能差异,但我认为这看起来更好看。但这只是我个人的偏好。
function &getByPath(array &$array, $path, $delimiter = '/'){
$result = NULL;
// do work here and assign as ref to $result if we found something to return
// if nothing is found that can be returned we will be returning a reference to a variable containing the value NULL
return $result;
}
答案 1 :(得分:2)
至于通过引用返回,它将无法正常工作
您只能通过函数引用返回变量 - 没有别的。
http://www.php.net/manual/en/language.references.return.php
您可能想重新考虑一下您是否真的需要引用,尤其是您已经将$array
作为参考并将其返回
答案 2 :(得分:2)
我不确定“引用”和“清洁代码”是否一起...... :(
无论如何,引用不是“指向对象/值的指针”,而是“指向”变量的指针。因此,只有变量才是合适的目标。所述变量可以“命名”一个对象/值(读取:被赋值),如帖子所示。但是,该帖子不会返回“空引用” - 它会返回对“name”null 的变量的引用。
(然后人们想知道为什么我在处理高级语言/概念时拒绝变量“将引用存储到对象”的术语......)
快乐的编码。
答案 3 :(得分:1)
针对您的特定问题的解决方案是概括您的代码:
function &getByPath(array &$array, $path, $delimiter = '/'){
if (!is_array($path)){
$path = explode($delimiter, $path);
}
$current =& $array;
foreach ($path as $part) {
$current =& $current[$part];
}
return $current;
}
现在没有返回魔术空值。相反,该函数将返回元素作为指定的路径,即使它尚不存在(路径将添加到数组并使用null
初始化)。
$element =& getByPath($array, 'hallo/world');
isset($element); // if the element didn't exist, this will return false
$element = 'hi'; // we can set the element, even if it did not exist
哦,顺便说一句:没有其他方法可以通过引用返回null
,我也不明白为什么你有这个问题;)通过引用返回意味着返回一个变量,以及,null
不是。
答案 4 :(得分:1)
我这样做(没有初始化$null
):
return $null;
它的好处就像提到的NikiC一样,您只需使用isset($result)
来确定结果是否存在。