У меня есть массив, который я использую в качестве стека для хранения пути через дерево. Каждый элемент указывает на узел в дереве, и я хочу вынуть последний элемент, а затем установить для объекта, упомянутого этим элементом, значение null.Можно ли разыменовать ссылку в PHP?
В основном:
$node = array_pop($path);
*$node = null;
при условии, что PHP был '*' оператор, как C-иш языками. Сейчас у меня есть уродливое решение, начиная с родительским узлом и запоминанием, какой ребенком я взял и затем установить, что в нуль, как в:
if($goLeft) {
$parent->left = null;
} else {
$parent->right = null;
}
Я говорю, что это некрасиво, так как массив, содержащий путь создается с помощью public function в моем древовидном классе. Я хотел бы показать возможность работать непосредственно с узлами в пути через дерево, не подвергая детализации реализации, которая обращается к идиосинкразии (функции?) В PHP. ATM Мне нужно включить логическое значение в возвращаемом значении ($ goLeft в этом случае), чтобы я мог обанкротить невозможность разыменовать ссылку.
Это второй раз, когда я столкнулся с этой проблемой, поэтому, если кто-нибудь знает способ, я могу сделать что-то похожее на первый блок кода, пожалуйста, поделитесь!
(EDIT)
После экспериментов со многими перестановками & х и массивов, то получается, что основная проблема заключалась в том, что я неправильно истолковал причину ошибки я получал.
Я попытался
$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. Хотелось, чтобы в первый раз я его прочитал!
Я не уверен, это то, что вы хотите, но вы можете использовать 'unset ($ parent-> left);' вместо '$ parent-> left = null;' – Leri
@PLB: Я думаю, вы имеете в виду ' unset', а не 'unlink'. –
@Rocket Конечно, делаю. Я очень устал. – Leri