Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]loader
Forum PHP.pl > Forum > Przedszkole
olechafm
dlaczego ten loader nie działa? z założeniem ma on ładować inne obiekty zgodnie z Singleton, jednak po wywołaniu jakiegoś obiektu, nie można uzyskać dostępu do jego zmiennych czy funkcji a obiekt jest tworzony

  1.  
  2. <?php
  3. class loader{
  4. private static $loaded=array();
  5.  
  6. public static function load($object){
  7.  
  8.  
  9. $valid=array("nazwa1","nazwa2","nazwa3");
  10.  
  11. if(!in_array($object,$valid)){
  12. throw new Exception("Obiekt ".$object." nie jest poprawną nazwą obiektu lub nie może być ładowany");
  13. }
  14.  
  15. if(empty(self::$loaded['$object'])){
  16. self::$loaded['$object']= new $object;
  17. }
  18.  
  19. return self::$loaded['$object'];
  20. }
  21. }
  22.  
  23.  
  24. ?>
  25.  


po utworzeniu jakiegoś obiektu:

  1.  
  2. $obiekt=loader::load("nazwa1");
  3.  
  4. if(is_object($obiekt)){echo "tak";}else{echo "nie";}
  5.  


daje wynik tak, jednak po wywołaniu jakiejś funkcji czy przy próbie dostępu do zmiennej daje rezultat

Fatal error: Call to undefined method Obiekt::funkcja() in... a gdy funkcja posiada konstruktor to również kod w nim nie jest wykonywany

proszę o jakieś podpowiedzi
Spawnm
Co to ma wspólnego z singletonem to nie wiem...
Nie masz nigdzie static. Kod powinien ci zawsze wywalać błędy.

a jak chcesz zobaczyć co ci zwraca loader to daj var_dump() ew. print_r()
olechafm
źle przekopiowałem kod tam są wszędzie static, widać to chyba bo odwołuję się do zmiennych wewnątrz klasy poprzez :: a nie $this->

a co to ma wspólnego z Singletonem? szczerze powiem, nie mi to oceniać bo w końcu zaczynam dopiero ale jest to przykład książkowy, loader kontroluje tworzenie nowych obiektów sprawdza czy obiekt o danej nazwie już istnieje (przechowuje go w tablicy) i jeśli tak to go zwraca, jeśli nie to tworzy nowy i zapisuje, zapobiega w ten sposób tworzeniu wielu instancji tego samego obiektu...


obiekt utworzony w ten sposób zwraca na var_dump i print_r:

  1. object(Config)#1 (4) { ["datasrc"]=> NULL ["configType"]=> string(0) "" ["parserOptions"]=> array(0) { } ["container"]=> object(Config_Container)#2 (7) { ["type"]=> string(7) "section" ["name"]=> string(4) "root" ["content"]=> string(0) "" ["children"]=> array(0) { } ["parent"]=> NULL ["attributes"]=> NULL ["_id"]=> string(34) "rootsection4dbe67d2baebd0.50930602" } }
  2.  
  3. Config Object ( [datasrc] => [configType] => [parserOptions] => Array ( ) [container] => Config_Container Object ( [type] => section [name] => root [content] => [children] => Array ( ) [parent] => [attributes] => [_id] => rootsection4dbe67d2baebd0.50930602 ) )


sama klasa ładowanego obiektu może być banalna i w konstruktorze robić jakieś samo echo "coś tam" i nie działa

no i udało mi się odnaleźć źródło problemu, okazało się, że klasa na której testowałem kod nie została poprawnie wgrana przez funkcje __autoload gdyż w jej zasięgu znalazła się inna klasa o takiej samej nazwie, którą __autoload użył do zbudowania obiektu, pytanie moje jednak po odnalezieniu tego problemu brzmi, jaki zasięg ma metoda __autoload gdy poszukuje odpowiedniej klasy i w jaki sposób dokładnie traktuje wpisy jak
  1. set_include_path(get_include_path().PATH_SEPARATOR."core");


jak daleko posunie się __autoload żeby odnaleźć definicje klasy?
greycoffey
Aby uniknąć takich problemów, najlepiej trzymać się standardu PSR-0 ;-)
olechafm
rzeczywiście standard wart uwagi, jednak opis nie do końca jasny i klarowny, może ktoś przedstawić przykład struktury katalogów, z plikami klas i ich nazwami, który będzie implementował ten standard dla podanej w tym standardzie funkcji __autoload, tak dla pewności żeby dokładnie zrozumieć



http://groups.google.com/group/php-standar...-final-proposal
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-2025 Invision Power Services, Inc.