2013-12-17 12 views
8

Mam następujący fragment kodu:Dlaczego w pierwszym wywołaniu nie ma błędu E_NOTICE?

error_reporting(E_ALL | E_STRICT); 

    function &getVal() { 
     $data = []; 

     return $data['hey']; 
     //return $whatever; 
    } 

    function getVal2() { 
     $data = []; 

     return $data['hey']; 
    } 

    var_dump(getVal()); // No E_NOTICE error is issued - why? 
    var_dump(getVal2()); // E_NOTICE error is issued. 

A pytanie brzmi: Dlaczego nie ma E_NOTICE błąd w pierwszym zaproszeniu? Wyjaśnienie jest najbardziej prawdopodobne, że zmienna $data['hey'] została utworzona w celu zwrócenia referencji. Jednak nadal wydaje się błędem nie wydawanie błędu E_NOTICE, gdy $data['hey'] (lub $whatever, ...) nie jest zdefiniowany.

+0

Sam odpowiedziałeś na to pytanie. Co do "wydaje się nie tak" ... to jest PHP, prawda? – Jon

+1

Cóż, jesteś absolutnie poprawny. Problem polega na tym, że utworzyło to poprzez zwykłe działanie polegające na odwoływaniu się do niego. Prawdopodobnie ma to związek z tym, jak referencje są obsługiwane pod maską, jak na przykład wywoływanie 'preg_match ('..', '..', $ match);' oczywiście nie będzie również narzekać na '$ match' nieistniejące jednak, jak punkt to wypełnia. Zobacz _return przez reference_ jako "Chcę, abyś uzyskał dostęp do danych i zmień dane w tej lokalizacji". To, że odrzucasz tę zmienną po powrocie, gdy zamyka się lunetę, jest poza punktem. Nie mówię, że to bardzo ładne, ale tak właśnie jest. – Wrikken

Odpowiedz

0

Myślę, że jest to związane z odniesieniem i jego słabymi stronami w PHP.

Podczas tworzenia odwołania w PHP tworzone jest powiązanie. Typowanie obiektów PHP nie jest ścisłe, a php nie wie, do jakiego obiektu się odwołuje, że interpreter zakłada, że ​​w obiekcie może istnieć ['hey'].

Brak PHP późnego wiązania i ścisłego pisania. Dlatego czasami pojawiają się takie "dziwne" rzeczy.

-3

Używaj tylko error_reporting(1) na początku pliku php ...

+0

To jest bardzo lakoniczna odpowiedź. Pomocne byłoby dodatkowe wyjaśnienie. –

1

To oczekiwane zachowanie

http://www.php.net/manual/en/language.references.whatdo.php#language.references.whatdo.assign

Jeśli przypiszesz, zdać, albo powrócić zmiennej niezdefiniowanej przez odniesienie, zostanie utworzone .

A niektóre związane z nimi "bugs":

https://bugs.php.net/bug.php?id=30350

Ok, wydaje się, że element jest tworzony, ponieważ próbujemy wrócić odniesienie do czegoś, co nie istnieje.

https://bugs.php.net/bug.php?id=27627

Podczas próby uzyskania dostępu do nieistniejącego elementu tablicy można skutecznie tworzenia go, stąd NULL wpisy w tablicy.

Powiązane problemy