Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> __autoload zaimplementowana wewnątrz klasy, nie działa, gdy została już zaimplementowana wcześniej...
Luneth
post
Post #1





Grupa: Zarejestrowani
Postów: 95
Pomógł: 7
Dołączył: 16.07.2007
Skąd: Gorzów Wielkopolski

Ostrzeżenie: (0%)
-----


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' ?

Ten post edytował Luneth 23.07.2010, 02:23:13
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
_olo_1984
post
Post #2





Grupa: Zarejestrowani
Postów: 289
Pomógł: 77
Dołączył: 5.08.2006

Ostrzeżenie: (0%)
-----


nie wiem czy dokładnie o to chodzi, ale zobacz spl_autoload_register
Go to the top of the page
+Quote Post
Luneth
post
Post #3





Grupa: Zarejestrowani
Postów: 95
Pomógł: 7
Dołączył: 16.07.2007
Skąd: Gorzów Wielkopolski

Ostrzeżenie: (0%)
-----


Patrzyłem już, próbowałem i nie mogę chyba ogarnąć działania tej funkcji albo to się nie sprawdza w tym przypadku...
Go to the top of the page
+Quote Post
wookieb
post
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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.
Go to the top of the page
+Quote Post
Luneth
post
Post #5





Grupa: Zarejestrowani
Postów: 95
Pomógł: 7
Dołączył: 16.07.2007
Skąd: Gorzów Wielkopolski

Ostrzeżenie: (0%)
-----


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)?
Go to the top of the page
+Quote Post
wookieb
post
Post #6





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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
Go to the top of the page
+Quote Post
Luneth
post
Post #7





Grupa: Zarejestrowani
Postów: 95
Pomógł: 7
Dołączył: 16.07.2007
Skąd: Gorzów Wielkopolski

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
wookieb
post
Post #8





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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.
Go to the top of the page
+Quote Post
Luneth
post
Post #9





Grupa: Zarejestrowani
Postów: 95
Pomógł: 7
Dołączył: 16.07.2007
Skąd: Gorzów Wielkopolski

Ostrzeżenie: (0%)
-----


Czyli nazwa klasy zawiera ścieżkę do pliku z nią, czy tak? I ten string należy potraktować explodem?
Go to the top of the page
+Quote Post
wookieb
post
Post #10





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Nie musisz. Wystarczy
  1. function __autoload($classname)
  2. {
  3. $classpath = str_replace('_', '/', $classname').'.php';
  4. require_one $classpath;
  5. }


Ten post edytował wookieb 23.07.2010, 14:52:46
Go to the top of the page
+Quote Post
Luneth
post
Post #11





Grupa: Zarejestrowani
Postów: 95
Pomógł: 7
Dołączył: 16.07.2007
Skąd: Gorzów Wielkopolski

Ostrzeżenie: (0%)
-----


Ostatnie pytanie. Czy to jest to co nazwałeś 'obsłużeniem include_path'?
Go to the top of the page
+Quote Post
Crozin
post
Post #12





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Luneth
post
Post #13





Grupa: Zarejestrowani
Postów: 95
Pomógł: 7
Dołączył: 16.07.2007
Skąd: Gorzów Wielkopolski

Ostrzeżenie: (0%)
-----


Oczywiście, że nie, sam to zrobilem od razu, ale chciałem wiedzieć co autor posta miał na myśli (IMG:style_emoticons/default/winksmiley.jpg)
edit: Przestrzenie nazw rozwiązanie ciekawe zaś znaleźć hosting z php 5.3 trudno trochę.

Ten post edytował Luneth 23.07.2010, 18:53:54
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.08.2025 - 23:23