Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: __autoload zaimplementowana wewnątrz klasy
Forum PHP.pl > Forum > PHP > Object-oriented programming
Luneth
Witam, załóżmy, że mamy taki przykładowy kod:
  1. <?php
  2. function __autoload($name)
  3. {
  4. echo 'a';
  5. }
  6.  
  7. class Sample
  8. {
  9. function __autoload($name)
  10. {
  11. echo 'b';
  12. }
  13. function sample()
  14. {
  15. $instance = new SampleName();
  16. }
  17. }
  18.  
  19. $instance = new Sample();
  20. $instance->sample();
  21. ?>


Wówczas i tak do załadowania zostanie wykorzystana funkcja wyświetlająca 'A', poza klasą. Czy można przeciążyć funkcję __autoload() tak, aby w powyższym przypadku wyświetliło się 'B' ?
_olo_1984
nie wiem czy dokładnie o to chodzi, ale zobacz spl_autoload_register
Luneth
Patrzyłem już, próbowałem i nie mogę chyba ogarnąć działania tej funkcji albo to się nie sprawdza w tym przypadku...
wookieb
Nie możesz przeciążyć standardowego __autoloada
A to co kolega podał powinieneś używać ZAMIAST __autoload aby działało w pełni prawidłowo.
Luneth
Swoją droga stosuję autoładowanie klas tylko w dwóch przypadkach jak na razie, gdy trzeba załadować kontroler, albo element menu, obsługujący linki, wstawienie tam statystyk, ankiety lub czegoś. Może lepszym rozwiązaniem jest zrobić jednak __autload() tylko np z mapą, żeby obsługiwało każdą istniejącą klasę (no z wyjątkiem singletonów)?
wookieb
A znasz takie schemat ładowania klas?
Kod
nazwa_klasy = nazwa/klasy.php
nazwa_klasy_dluzsza = nazwa/klasy/dluzsza.php

Oczywiście pozostaje odpowiednio obsłużyć include_path
Luneth
Wprowadzenie tego schematu kosztowałoby mnie w chwili obecnej nieco więcej zmian, dlatego szukałem sposobu na przeciążenie __autoload, szkoda, że takiej możliwości w php nie ma.
wookieb
Cytat(Luneth @ 23.07.2010, 15:13:53 ) *
Wprowadzenie tego schematu kosztowałoby mnie w chwili obecnej nieco więcej zmian, dlatego szukałem sposobu na przeciążenie __autoload, szkoda, że takiej możliwości w php nie ma.

Też tak miałem ale jest to jedno z lepszych rozwiązań. Oczywiście nie idealne, czasem wymaga modyfikacji lecz warto było.
Luneth
Czyli nazwa klasy zawiera ścieżkę do pliku z nią, czy tak? I ten string należy potraktować explodem?
wookieb
Nie musisz. Wystarczy
  1. function __autoload($classname)
  2. {
  3. $classpath = str_replace('_', '/', $classname').'.php';
  4. require_one $classpath;
  5. }
Luneth
Ostatnie pytanie. Czy to jest to co nazwałeś 'obsłużeniem include_path'?
Crozin
Cytat
A znasz takie schemat ładowania klas?
Kod
nazwa_klasy = nazwa/klasy.php
nazwa_klasy_dluzsza = nazwa/klasy/dluzsza.php
PHP 5.3 jest już na tyle "stabilne", że można korzystać z jego dobrodziejstwa jakim są przestrzenie nazw, a nie taki burdel w nazewnictwie. Przy czym sama metoda pozostaje taka sama jakby na to nie patrzeć.
Cytat
Ostatnie pytanie. Czy to jest to co nazwałeś 'obsłużeniem include_path'?
tak ciężko?
Luneth
Oczywiście, że nie, sam to zrobilem od razu, ale chciałem wiedzieć co autor posta miał na myśli winksmiley.jpg
edit: Przestrzenie nazw rozwiązanie ciekawe zaś znaleźć hosting z php 5.3 trudno trochę.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.