2013-08-06 35 views
5

Nie jestem do końca pewien, dlaczego tak się dzieje, ani jak właściwie to wyjaśnić, ale może ktoś może rzucić trochę światła na to.Zmienna pusta do ponownego przypisania

Mam system CMS oparty na CodeIgniter/OpenCart Framework wykorzystujący rejestr, kontroler i moduł. Mam biegać w sytuacji, w której już wcześniej zapisany do zmiennej w rejestrze jako:

$this->application_page = 'current/page'; 

Ale z jakiegoś powodu, gdy nazywam go w aplikacji:

echo empty($this->application_page)?'yes':'no'; 
//Returns Yes 

Ale .. Kiedy Przypisz IT:

echo empty($this->application_page)?'yes':'no'; 
//Returns Yes 

$page = $this->application_page; 
echo empty($page)?'yes':'no'; 
//Returns No 

A powraca var_dump:

var_dump($this->application_page); 
string 'current/page' (length=12) 

Mogę obejść to dość łatwo, po prostu używając $page, ale jestem ciekawy, dlaczego tak się dzieje?

UPDATE:

Więc zawiedli wokół z funkcją _isset ale nie zmusić go do pracy, być może mój błąd, może nie .. Oto jak to wszystko działa razem:

class Registry { 
    private $data = array(); 
    public function get($key){ return (isset($this->data[$key]) ? $this->data[$key] : NULL); } 
    public function set($key,$val){ $this->data[$key] = $val; 
} 

abstract class Controller { 
    protected $registry; 
    public function __construct($registry){ $this->registry = $registry; } 
    public function __get($key){ return $this->registry->get($key); } 
    public function __set($key,$value){ $this->registry->set($key, $value); } 
} 

class Applications { 
    private $registry; 
    function __construct($Registry){ $this->registry = $Registry; } 
    function __get($key){ return $this->registry->get($key); } 
    function __set($key,$val){ return $this->registry->set($key,$val); } 
    public function buildApplication(){ 
     $this->application_page = 'current/page'; 
     $application = new application($this->registry); 
    } 

} 

class Application extends Controller { 
    public function index(){ 
    echo empty($this->application_page)?'yes':'no'; 
    //Returns Yes 

    $page = $this->application_page; 
    echo empty($page)?'yes':'no'; 
    //Returns No 
    } 
} 

Mam nadzieję, że to pomaga? Miał typo, funkcje rejestru nie są magiczne metody. Również rejestr $ został zadeklarowany w aplikacjach.

+0

Czy jesteś w 100% pewien, że nie miałeś literówki w swoich nazwach var podczas testowania tego? – NDM

+0

Przepraszamy za opóźnienie! Tak, jestem pewien, dwukrotnie sprawdziłem około 5 razy, zanim wysłałem =) – Corey

+0

@Corey Proszę zobaczyć moją zaktualizowaną odpowiedź. – ComFreek

Odpowiedz

4

Klasa prawdopodobnie nie dostosował magiczną __isset() sposobu, który jest wyzwalany przez wywołanie isset() lub empty() na właściwości niedostępnych.


przykład:

Live demo I:

<?php 

class Test { 
    private $a = '42'; 

    public function __get($name) { 
     return $this->a; 
    } 
} 

$obj = new Test(); 
var_dump($obj->a);  // string(2) "42" 
var_dump(empty($obj->a)); // bool(true) 

realizacji sposobu __isset() następująco (Live demo II) daje poprawny wynik:

public function __isset($name) { 
    if ($name == 'a') { 
     return true; 
    } 
    return false; 
} 

// ... 
var_dump($obj->a);  // string(2) "42" 
var_dump(empty($obj->a)); // bool(false) 


jest tu nowy v Stan z Twojego kodu wdrażaniu metod __isset(): http://ideone.com/rJekJV

Change log:

  • Dodany __isset() metoda Controller klasa, która wewnętrznie wywołuje Registry::has().
  • Dodano metodę has() do Registy klasy.

  • [Tylko do testowania: inicjalizacji obiektu i uruchomienia metody Application::index().]

Był jeden problem (po aktualizacji odpowiedź):

  • Nie zadeklarowali $registry jako zmienna członkowskiego w Applications klasowych.
    Kod nie inaczej, ponieważ nie ma dostępu (magic __set() metoda!) Rzeczywistą zmienną składową

  • Ponadto, trzeba było sporo redundancji w kodzie (nie DRY). Mam nadzieję, że to nie jest kod produkcyjny;)

+0

Niestety, w moim poście było kilka liter: __set i __get rzeczywiście zostały ustawione i otrzymane. W aplikacjach ustawiono również rejestr $. Czy zaleca się pozbycie się zmiennej "data" w rejestrze i po prostu użycie __isset. Ta część została skopiowana ze schematu opencart. – Corey

+0

@Corey Zaktualizowałem swoją odpowiedź. Jeśli chcesz pozbyć się 'Registry :: $ data', gdzie jeszcze chcesz zapisać dane rejestru? Moje zalecenie: użyj '__get(), __set(), __isset()' lub czegoś podobnego 'get(), set(), has()'. – ComFreek

+0

Piękne! Wszystko działa teraz! Dziękuję Ci za całą twoją pomoc!!! – Corey

Powiązane problemy