Mam tablica używam jako stos do przechowywania ścieżki przez drzewo. Każdy element wskazuje na węzeł w drzewie i chcę usunąć ostatni element, a następnie ustawić obiekt, do którego odnosi się ten element, na wartość null.Czy można wyrejestrować odwołanie w PHP?
Zasadniczo:
$node = array_pop($path);
*$node = null;
zakładając, że PHP miał operator '*' jako języki C-owski zrobić. Teraz mam brzydkie rozwiązanie zaczynając od węzła nadrzędnego i zapamiętywania, które dziecko wziąłem, a następnie ustawiając że null jak w:
if($goLeft) {
$parent->left = null;
} else {
$parent->right = null;
}
powiedzieć, że jest brzydki, ponieważ tablica zawierająca ścieżkę tworzony jest przez funkcja publiczna w mojej klasie drzewa. Chciałbym wystawić możliwość pracy bezpośrednio na węzłach w ścieżce przez drzewo bez ujawniania szczegółów implementacji, które adresują idiosynkrazę (cechę?) W PHP. ATM Muszę dołączyć wartość boolean do wartości zwracanej (w tym przypadku $ goLeft), aby uniknąć obejścia problemu z dereferencją odniesienia.
To już drugi raz, kiedy napotkałem ten problem, więc jeśli ktoś wie, w jaki sposób mogę zrobić coś podobnego do pierwszego bloku kodu, proszę udostępnij!
(EDIT)
Po eksperymentach z wielu permutacji & „s i tablic, okazuje się, że podstawowym problemem było to, że błędnie zinterpretowała przyczynę błędu ja trafiałem.
Próbowałem
$a = ($x > $y) ? &$foo[$bar] : $blah;
i got "błąd składni, niespodziewany '&'". Zinterpretowałam to jako oznaczający, że problem polegał na użyciu & -operatora na $foo[$bar]
. W rzeczywistości okazuje się, że sprawcą jest? -operator, ponieważ działa doskonale. Poszedłem więc w dzikim pościgu za szukaniem rozwiązania problemu, który nie istniał. Dopóki nie zerwam łańcucha &, PHP robi to, co chcę, czyli operuje na obiekcie, do którego odnosi się zmienna (nie sama zmienna). Przykład
$a1 = new SomeClass;
$a2 = &$a1;
$a3 = &$a2;
$a4 = &$a3;
$a4 = 42; // This actually sets $a1 to 42
var_dump($a1); // Emits 42
Co zawiedli mnie jest to, że myślałem, że obiekty są przekazywane przez odniesienie i tak dookoła (to źle), więc nie sądzę & było konieczne, jeśli wyrażenie rozwiązany do obiektu. To znaczy:
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
Okazuje się, że dokładna tego problemu polega na http://www.php.net/manual/en/language.oop5.references.php. Żałuję, że nie zatonął po raz pierwszy czytałem!
Nie jestem pewien, tego właśnie chcesz, ale możesz użyć 'unset ($ parent-> left);' zamiast '$ parent-> left = null;' – Leri
@PLB: Myślę, że masz na myśli ' unset', a nie 'unlink'. –
@Rocket Jasne, robię. Jestem bardzo zmęczony. – Leri