У меня есть массив, который я использую в качестве стека для хранения пути через дерево. Каждый элемент указывает на node в дереве, и я хочу вынуть последний элемент, а затем установить объект, на который ссылается этот элемент, на null.
В принципе:
$node = array_pop($path);
*$node = null;
предполагая, что PHP имеет оператор '*', как это делают языки C-ish. Прямо сейчас у меня есть уродливое решение начать с родительского node и вспомнить, какой дочерний я взял, а затем установил значение 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;
}
работает отлично. Таким образом, я пошел на дикую охоту на гусей, пытаясь найти обходной путь для проблемы, которой не было. Пока я не нарушаю цепочку & s, 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. Хотелось бы, чтобы в первый раз я его прочитал!