2011-11-16 10 views
8

Znalazłem kawałek kodu poniżej w kilku miejscach w Internecie, a nawet tutaj w Stack Overflow, ale po prostu nie mogę owinąć się wokół niego. Wiem, co robi, ale nie wiem, jak to działa, nawet w przypadku przykładów. Zasadniczo jest przechowywanie wartości, ale nie wiem, jak dodać wartości do rejestru. Czy ktoś może spróbować wyjaśnić, jak działa ten kod, zarówno w jaki sposób ustawiam i pobiera z niego wartości?Rejestru rejestru PHP

class Registry { 

    private $vars = array(); 

    public function __set($key, $val) { 
     $this->vars[$key] = $val; 
    } 

    public function __get($key) { 
     return $this->vars[$key]; 
    } 
} 
+0

Powinieneś uniemożliwić nadpisanie zestawu za pomocą czegoś podobnego do poniższego (używa również argumentu tablica_key_istnieje, powinno używać go zarówno dla zestawu, jak i uzyskać w tym przypadku), co jest prawdopodobnie równie ważne jak nieużywanie nieistniejących kluczy, ponieważ cały cel rejestr jest do przechowywania informacji, który jest rodzaju pokonany przez możliwość nadpisania: 'public function set ($ key, $ val) {if (! array_key_exists ($ key, $ this -> _ nfo)) {$ this-> _nfo [$ key] = $ val; }} ' – user1205600

Odpowiedz

7

To użyciem PHP posiekany na property overloading dodać wpisy do i odzyskać dane z prywatnego $vars tablicy.

Aby dodać obiekt, należy użyć ...

$registry = new Registry; 
$registry->foo = "foo"; 

Wewnętrznie byłoby dodać foo klucz do tablicy $vars z wartości ciąg „foo” za pomocą magicznego __set metody.

Aby pobrać wartość ...

$foo = $registry->foo; 

Wewnętrznie, by odzyskać ten wpis z tablicy $varsfoo za pomocą magicznego __get metody.

Metoda powinna naprawdę sprawdzać pod kątem nieistniejących pozycji i obsługiwać takie rzeczy. Kod taki jak "jest", wywoła błąd E_NOTICE dla niezdefiniowanego indeksu.

lepsza wersja może być

public function __get($key) 
{ 
    if (array_key_exists($key, $this->vars)) { 
     return $this->vars[$key]; 
    } 

    // key does not exist, either return a default 
    return null; 

    // or throw an exception 
    throw new OutOfBoundsException($key); 
} 
+0

Dzięki, pomyślałem, że zwariowałem. Pomogło mi to wrócić i sprawdzić, co się dzieje. Próbowałem ustawić akcję formularza, ale zawsze było pusto. Okazuje się, że byłem na stronie indeksu, więc nie było żadnej wartości. DOH !. Wypróbowałem formularz na innej stronie i działało dobrze. Dzięki za pomoc. Kiedy mówisz "posiekany", czy to oznacza, że ​​nie powinno się go używać w ten sposób? –

+0

@IanHoar Cóż, zdecydowanie nie powinno się nazywać * przeciążaniem * – Phil

+0

@Phil Widzę, jak dodajesz klucz, ale jak dodać parę klucz-wartość? –

8

Możesz chcieć sprawdzić PHP.NET - Overloading

Zasadniczo byś zrobił ...

$Registry = new Registry(); 

$Registry->a = 'a'; //Woo I'm using __set 
echo $Registry->a; //Wooo! I'm using __get 

Więc używam __set($a, 'This value is not visible to the scope or nonexistent') Również używam __get($a);

Mam nadzieję, że to pomogło!