2012-12-21 5 views
7

Po prostu bawię się i znalazłem to.Dlaczego ten kod NIE rzuca nieokreślonej właściwości powiadomienia PHP?

Dlaczego wywołanie przez odniesienie do $this->newAxis() robi nie rzucać zawiadomienie o niezdefiniowanej właściwości (xAxis nieruchomości), natomiast var_dump() robi?

public function newXAxis() 
{ 
    // var_dump(isset($this->xAxis)); // false 
    // var_dump($this->xAxis); // Throws the notice 
    return $this->newAxis($this->xAxis); // Should throw the notice?! 
} 

protected function newAxis(&$current) 
{ 
    // ... 
} 

Czy to ma coś wspólnego z przejścia przez odniesienie, a tym samym nie dostęp do właściwości bezpośrednio?

Odpowiedz

7

Tak, dzieje się tak, ponieważ przekazuje się ją przez odniesienie. Kiedy przechodzisz przez wartość, następuje próba odczytania wartości zmiennej - pojawia się komunikat. Gdy przechodzisz przez referencję, wartości nie trzeba czytać.

Po wykonaniu tej czynności zmienna/właściwość zostanie utworzona, jeśli jeszcze nie istnieje.

Z manual:

Jeśli przypiszesz, zdać, albo powrócić zmiennej niezdefiniowanej przez odniesienie, to dostanie utworzony.

<?php 
function foo(&$var) { } 
foo($a); // $a is "created" and assigned to null 
+0

Uwielbiam programować, ponieważ zawsze uczysz się czegoś nowego. Dzięki za odniesienie do instrukcji. – gremo

-2

Idę w opałach tutaj ...

Ponieważ łączysz go jako obiektu (z klasą) nie daje zawiadomienie, podczas gdy var_dump coś to rodzaj dostępu to jak tablica (a ponieważ jest pusta, wyrzuca powiadomienie)

5
newAxis(&$current) 

jest wprost przez odniesienie. oznacza to, że przekazujesz zmienną.

Domyślnie wszystkie zmienne w PHP są niezdefiniowane.

Definiując je, wystarczy użyć np.

$a = 1; 

Jak widać, PHP nie narzeka tutaj $a jest niezdefiniowany, prawda?

Ok;), patrz tutaj:

$a = $b; 

PHP teraz narzeka, że ​​$b jest niezdefiniowany.

Podobnie jak $a (można zdefiniować zmienną) i $b (zmienna nie jest zdefiniowana) to z biegiem przez odniesienie lub wartość:

$this->newAxis($a); 

Zmienna $a jest zdefiniowana, gdy przekazywane przez referencję. Przenosi jego domyślną wartość NULL. A teraz przykład $b:

var_dump($b); 

var_dump trwa to parametry przez wartość. Dlatego PHP skarży się, że $b nie jest zdefiniowany.

I to wszystko. Mam nadzieję, że było to wystarczająco jasne.