PHP并返回空引用(重新访问)

时间:2011-10-22 19:40:34

标签: php null reference return-by-reference

之前我曾问question,基本上将$null = null方法作为给定,在PHP中返回空引用。

经过一些粗略的谷歌搜索,我没有多少出现;让我假设前面提到的方法是最好的(只读)方式。但是,对我来说似乎很奇怪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"
    }
  }
}
*/

5 个答案:

答案 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)来确定结果是否存在。