Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]loader
olechafm
post 1.05.2011, 15:32:28
Post #1





Grupa: Zarejestrowani
Postów: 125
Pomógł: 2
Dołączył: 8.10.2010
Skąd: Poniemieckie miasto przesiedleńców

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


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

Ten post edytował olechafm 2.05.2011, 09:18:51
Go to the top of the page
+Quote Post
Spawnm
post 1.05.2011, 15:44:40
Post #2





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




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()
Go to the top of the page
+Quote Post
olechafm
post 2.05.2011, 13:32:50
Post #3





Grupa: Zarejestrowani
Postów: 125
Pomógł: 2
Dołączył: 8.10.2010
Skąd: Poniemieckie miasto przesiedleńców

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


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

Ten post edytował olechafm 2.05.2011, 13:24:43
Go to the top of the page
+Quote Post
greycoffey
post 2.05.2011, 21:43:55
Post #4





Grupa: Zarejestrowani
Postów: 320
Pomógł: 29
Dołączył: 3.04.2010

Ostrzeżenie: (20%)
X----


Aby uniknąć takich problemów, najlepiej trzymać się standardu PSR-0 ;-)
Go to the top of the page
+Quote Post
olechafm
post 4.05.2011, 11:08:14
Post #5





Grupa: Zarejestrowani
Postów: 125
Pomógł: 2
Dołączył: 8.10.2010
Skąd: Poniemieckie miasto przesiedleńców

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


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

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

 



RSS Wersja Lo-Fi Aktualny czas: 19.04.2024 - 19:21