2010-01-11 7 views

Odpowiedz

20

Mechanizm autoloading działa dokładnie w ten sam sposób z klas statycznych, że robi z non-statyczną:

  • Funkcja automatycznego ładowania/metoda jesteś zarejestrowany zostanie wywołana
  • Będzie otrzymać nazwę klasa
  • I będziesz musiał wymagają/obejmują niezbędne kod PHP


właściwie autoloader nie nawet "wiedzieć", jeśli jest wezwany do załadowania klasy statycznej lub dynamicznej, ponieważ jej rolą jest załadowanie kodu PHP zawierającego definicję klasy - i nie tworzenie instancji ani nic.

6

Tak, to by wywołać __autoload.

To nie tylko "nowe" powoduje automatyczne ładowanie - może to zrobić każde odwołanie do nieznanej klasy. Nawet coś takiego jak użycie class_exists wywoła autoloader (nie zawsze jest to pożądane zachowanie, dlatego też class_exists ma drugi parametr wyłączający automatyczne ładowanie)

5

Z pewnością najlepszym i najszybszym sposobem jest wypróbowanie go?

Z dokumentacji nic nie wynika, że ​​potrzebne jest new.

+1

+1 za wzmiankę o bardzo dokładnej metodzie takich rzeczy: po prostu spróbuj i zobacz, co się stanie :-) –

+0

Hahaha, dzięki! –

0

Miałem jeden problem z tym, że bardzo pomniejszy błąd składni dał dość niejasny komunikat o błędzie, gdy wyglądało na to, że __autoload() nie był wywoływany.

SomeClass:callStaticMethod(); // Doesn't call autoload for "SomeClass" 

SomeClass::callStaticMethod(); // Successfully calls autoload for "SomeClass" 

PHP dziwnie interpretuje singiel ":" (zamiast poprawnego podwójnego "::") jako nic. Traktuje callStaticMethod() jako globalne wywołanie metody, co oznacza, że ​​pomija __autoload.

+0

Wiem, że to jest stare, ale chcę się domyślić, co tu się dzieje. Myślę, że to zinterpretuje 'SomeClass' jako odniesienie do zmiennej globalnej, która nie istnieje, i': 'jako początek bloku kodu. Tak jakbyś miał przejść 'foreach():'. – Anther

+0

W rzeczywistości, ':' jest symbolem etykiety PHP, jeśli jest używany w ten sposób. Zatem 'SomeClass: callStaticMethod()' zostanie zinterpretowane jako globalna funkcja o nazwie 'callStaticMethod' zaraz po etykiecie' SomeClass'. Etykiety są używane dla słowa kluczowego PHP 'goto' :) http://us2.php.net/goto –

0

Miałem dokładnie to samo pytanie, co oryginalny plakat po autoloadingu klas, nazywając ich statyczne metody nie działa. Używałem Php 5.3.5 i wpadłem na następujące rozwiązanie.

function autoload($class_name) { 
    $directories = array(
     'php/classes/', 
     'php/vendor/' 
    ); 
    foreach ($directories as $directory) { 
     if (file_exists($directory . $class_name . '.php')) { 
      require_once($directory . $class_name . '.php'); 
      return; 
     }  
    } 
} 
spl_autoload_register('autoload'); 

Uwaga: funkcja spl_autoload_register został użyty zamiast __autoload co wydaje się być rozwiązaniem.

0

Celem autoloadera jest załadowanie class, gdy zajdzie taka potrzeba. Tak więc, jeśli twój kod klienta potrzebuje klasy, ponieważ chcesz uzyskać dostęp do statycznego członka klasy, a jeszcze nie został załadowany, boom, to ładuje go i umieszcza go w grze.

Logicznie rzecz biorąc, pierwszą rzeczą, która powinna działać, są połączenia z członkami statycznymi. Używanie konstruktora do tworzenia instancji obiektu zazwyczaj ma miejsce po załadowaniu klasy.Tak więc statyczny przypadek powinien być pierwszy w twoim sercu (ale jest zbyt wiele książek i takich, które nie wykorzystują statycznych członków klasy). :-)

Powiązane problemy