Luneth
23.07.2010, 02:22:18
Witam, załóżmy, że mamy taki przykładowy kod:
<?php
function __autoload($name)
{
}
class Sample
{
function __autoload($name)
{
}
function sample()
{
$instance = new SampleName();
}
}
$instance = new Sample();
$instance->sample();
?>
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
23.07.2010, 07:16:13
nie wiem czy dokładnie o to chodzi, ale zobacz
spl_autoload_register
Luneth
23.07.2010, 12:09:45
Patrzyłem już, próbowałem i nie mogę chyba ogarnąć działania tej funkcji albo to się nie sprawdza w tym przypadku...
wookieb
23.07.2010, 12:14:57
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
23.07.2010, 12:30:55
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
23.07.2010, 12:36:09
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
23.07.2010, 14: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.
wookieb
23.07.2010, 14:19:07
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
23.07.2010, 14:46:47
Czyli nazwa klasy zawiera ścieżkę do pliku z nią, czy tak? I ten string należy potraktować explodem?
wookieb
23.07.2010, 14:52:35
Nie musisz. Wystarczy
function __autoload($classname)
{
$classpath = str_replace('_', '/', $classname').'.php
'; require_one $classpath;
}
Luneth
23.07.2010, 15:51:15
Ostatnie pytanie. Czy to jest to co nazwałeś 'obsłużeniem include_path'?
Crozin
23.07.2010, 16:12:40
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
23.07.2010, 16:53:30
Oczywiście, że nie, sam to zrobilem od razu, ale chciałem wiedzieć co autor posta miał na myśli
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.