2009-07-23 10 views
5

Wpadłem dziś na bardzo dziwne zachowanie w niektórych z naszych kodów PHP. Mamy klasę do obsługi plików. To mniej więcej tak:niepubliczne zarezerwowane słowo?

class AFile { 

//usual constructor, set and get functions, etc. 
//... 

    public function save() { 
    //do some validation 
    //... 

    if($this->upload()) { //save the file to disk 
     $this->update_db(); //never reached this line 
    } 
    } 

    private function upload() { 
    //save the file to disk 
    //... 
    return ($success) ? true : false; 
    } 
} 

Wyglądało to całkiem normalne dla nas, ale funkcja $ this-> Prześlij() nigdy nie wrócił bynajmniej NULL. Sprawdziliśmy, czy działa właściwa funkcja. Wycofaliśmy jego wartość zwracaną, zanim została zwrócona. Próbowaliśmy tylko zwracać wartość true lub nawet ciąg znaków. Wszystko sprawdzało się dobrze. Ale $ this-> upload nadal jest oceniany jako NULL. Ponadto w dziennikach nie było nic, a ERROR_ALL jest włączony.

W irytacji zmieniliśmy nazwę funkcji na foo_upload. Nagle wszystko działało. "upload" nie znajduje się na liście PHP reserved words. Ktoś myśli, dlaczego funkcja klasy o nazwie "upload" nie powiedzie się?

+0

Czy umieściłeś echo w funkcji przesyłania? –

+0

Czy może być gdzieś przesłonięty? – Greg

+0

@ Chacha: Wprowadziliśmy echo do funkcji przesyłania. Dało to oczekiwane wartości. @Greg: Klasa AFile nie ma dzieci (jeszcze), więc jej metody nie powinny być nadwerężone. – dnagirl

Odpowiedz

1

Jednym ze sposobów, aby uzyskać wartość null, gdy „wywołanie” Prześlij byłoby, gdybyś miał to (próby dostępu właściwość inexisting):

if($a = $this->upload) { // => NULL 
    $this->update_db(); //never reached this line 
} 
var_dump($a); 

tego (z PO) zamiast (próby wywołania istniejącą metodę):

if($a = $this->upload()) { // => true or false 
    $this->update_db(); //never reached this line 
} 
var_dump($a); 

Czy sprawdziłeś, czy nie zapomniałeś ()?

Gdyby nie to, spróbuj z error_reporting ustawiony E_ALL i wyświetlanie błędów:

ini_set('display_errors', true); 
error_reporting(E_ALL); 

(mówiłeś "ERROR_ALL jest on", więc nie wiem, że to, co masz na myśli)

+0

Przepraszam, miałem na myśli error_reporting (E_ALL). Nawiasy są obecne i nie ma żadnych obiektów o tej samej nazwie. Próbowaliśmy złapać wynik $ this-> upload() w $ var, jak sugerujesz. To nie miało znaczenia. – dnagirl

+0

ok :-(naprawdę zainteresowany znać odpowiedź, to! –

2

Upewnij się, że instrukcja return na końcu metody przesyłania jest jedyną instrukcją return w tej metodzie.

+0

To jest. Ale to bardzo dobry punkt. – dnagirl

Powiązane problemy