我有一个数组用作堆栈来存储通过树的路径。每个元素都指向树中的一个节点,我想弹出最后一个元素,然后将该元素引用的对象设置为 null。
基本上:
$node = array_pop($path);
*$node = null;
假设 PHP 像 C-ish 语言一样有一个 '*' 运算符。现在我有一个丑陋的解决方案,从父节点开始并记住我带了哪个孩子,然后将其设置为 null,如下所示:
if($goLeft) {
$parent->left = null;
} else {
$parent->right = null;
}
我说这很难看,因为包含路径的数组是由我的树类中的公共函数创建的。我想公开直接在通过树的路径中的节点上工作的能力,而不公开解决 PHP 中的特质(功能?)的实现细节。ATM 我需要在返回值中包含一个布尔值(在本例中为 $goLeft),这样我就可以解决无法取消引用引用的问题。
这是我第二次遇到这个问题,所以如果有人知道我可以做类似于第一块代码的方法,请分享!
(编辑)
在尝试了 & 和数组的许多排列之后,事实证明,基本问题是我误解了我得到错误的原因。
我试过
$a = ($x > $y) ? &$foo[$bar] : $blah;
并得到“语法错误,意外'&'”。我将此解释为问题出在$foo[$bar]
. 实际上,罪魁祸首是 ? 运算符,因为
if($x > $y) {
$a = &$foo[$bar];
} else {
$a = null;
}
工作得很好。因此,我进行了一次疯狂的追逐,为不存在的问题寻找解决方法。只要不打断&的链,PHP就做我想做的事,就是对变量引用的对象(不是变量本身)进行操作。例子
$a1 = new SomeClass;
$a2 = &$a1;
$a3 = &$a2;
$a4 = &$a3;
$a4 = 42; // This actually sets $a1 to 42
var_dump($a1); // Emits 42
让我感到困惑的是,我认为对象无论如何都是通过引用传递的(这是错误的),所以如果表达式解析为对象,我认为 & 是不必要的。我是说:
class A {
public $b;
}
class B {}
$a = new A;
$a->b = new B;
$c1 = $a->b;
$c2 = &$a->b;
$c1 = 42; // Merely assigns 42 to $c1
$c2 = 42; // Assigns 42 to $a->b
事实证明,这个确切的问题在http://www.php.net/manual/en/language.oop5.references.php得到了解决。希望在我第一次阅读时就沉没了!