Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php4][oop] Autoodpalanie klas
Armageddon
post
Post #1





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 18.03.2007

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


mam taką klasę główną:

  1. <?php
  2. class core{
  3.    function loadClassByArray($array){
  4.        foreach($array as $class){
  5.            $this->loadClass($class, 1);
  6.        }
  7.    }
  8.    function loadClass($class, $runClass){
  9.        require_once 'classes/'.$class.'.class.php';
  10.        if($runClass==1){
  11.            $this->runClass($class);
  12.        }
  13.    }
  14.    function runClass($class){
  15.        $classx='$'.$class;
  16.        eval("$classx = new $class;");
  17.    }
  18. }
  19. ?>


nie wiem jak rozwiązać sprawę i autoładowaniem klas. Załóżmy, że pobieram klasę $core->loadClass('template', 1); i już pod zmienną $template mam uchwyt do klasy template ($template= new template;. Próbowałem walczyć z eval, ale coś nie działa. Bardzo proszę o pomoc, o już nie mogę wytrzymać. Piszę sobie takiego mini frameworka dla własnych potrzeb i kurde siedzę w tym bagnie już jakiś czas i nic mi do głowy nie przychodzi.


Any ideas? wstydnis.gif
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
likemandrake
post
Post #2





Grupa: Zarejestrowani
Postów: 175
Pomógł: 17
Dołączył: 23.06.2006

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


Chyba mi się nudzi :]

  1. <?php
  2. class core{
  3.   function loadClass($class, $runClass = false){
  4.       require_once 'classes/' . $class . '.class.php';
  5.      
  6.       if(true == $runClass){
  7.           return new $class();
  8.       }
  9.   }
  10. }
  11.  
  12. $instance = core::loadClass('Klasa', true);
  13. core::loadClass('InnaKlasa');
  14. ?>


Twoje rozwiązanie ze zmienną nie przejdzie, ponieważ eval jest wykonywany w metodzie, a więc zmienne w eval na których operujesz są traktowane jako lokalne zmienne metody.

Jeżeli bardzo chcesz to rozwiązać na swój sposób (niestety nieciekawy), to zrób to tak:

  1. <?php
  2. class core{
  3.   function loadClassByArray($array){
  4.       foreach($array as $class){
  5.           $this->loadClass($class, 1);
  6.       }
  7.   }
  8.   function loadClass($class, $runClass){
  9.       require_once 'classes/'.$class.'.class.php';
  10.      
  11.       if($runClass==1){
  12.           $GLOBALS[$class] = new $class();
  13.       }
  14.   }
  15. }
  16.  
  17. $Klasa = null;
  18. core::loadClass('Klasa', 1);
  19. ?>


--------------------
serwiswww.pl
Go to the top of the page
+Quote Post
bim2
post
Post #3





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


W tym wypadku moim zdaniem GLOBALS nei jest aż takie złe, ale pokusiłbym się o
  1. <?php
  2. $GLOBALS[('o'.ucfirst($class))] = new $class()
  3. ?>


--------------------
Go to the top of the page
+Quote Post
likemandrake
post
Post #4





Grupa: Zarejestrowani
Postów: 175
Pomógł: 17
Dołączył: 23.06.2006

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


Tak czy inaczej istnieje tu duże ryzyko, że jeden obiekt tej samej klasy nadpisze mu drugi jeśli w odpowiedniej porze nie zrobi sobie dodatkowej referencji do danej instancji.


--------------------
serwiswww.pl
Go to the top of the page
+Quote Post
mike
post
Post #5





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


~Armageddon ja mam pytanie. Po co automatycznie tworzysz instancję każdej napotkanej klasy?
Pozwolę sobie odpowiedzieć: Bo nie mogłeś wymyśleć nic bardziej głupiego?
Go to the top of the page
+Quote Post
Armageddon
post
Post #6





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 18.03.2007

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


to w jaki sposób działają frameworki CI albo Kohana?

Mi chodzi o to, że na początku pobierane są wszystkie klasy i autoodpalane (ło kurde - trochę niewydajne :/). Później w zależności od podanej strony pobierany jest dany plik inc.php. Chyba, że lepszym wyjściem byłoby podzielenie na kontrolery - pobierane w zależności od przekazanej zmiennej w index.php/zmienna, metody - operacje na bazie danych, klasy generalne - najważniejsze klasy, serce frameworka i helpery - klasy dodatkowe dodawane w konstruktorach kontrolerów w zależności od potrzeb... I może lepiej przejść na PHP5 tongue.gif
Go to the top of the page
+Quote Post
phpion
post
Post #7





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(Armageddon @ 18.02.2009, 00:05:59 ) *
Mi chodzi o to, że na początku pobierane są wszystkie klasy i autoodpalane (ło kurde - trochę niewydajne :/).

Bzdura! Zawsze ładowane są tylko te pliki, które są aktualnie potrzebne.

PS: wczytywanie klas nie jest równoznaczne z tworzeniem obiektów danej klasy

Ten post edytował phpion 17.02.2009, 22:14:23
Go to the top of the page
+Quote Post
wrzasq
post
Post #8





Grupa: Zarejestrowani
Postów: 206
Pomógł: 18
Dołączył: 6.03.2006
Skąd: Szczecin

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


Boże, człowieku jeszcze na dodatek w PHP4. Proszę, to aż w oczy boli jakie ty bzdury piszesz... i jeszcze sie zastanawiasz nad PHP5 "może". Zazwyczaj nie lubię niekonstruktywnej krytyki, ale ten temat jest tak beznadziejnie bezsensowny...


--------------------
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #9





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


Jak wyzej.

"Use php5, fool!" - masz __autoload() i normalna (nie-chorą) obiektowke.

I nie tworz obiektow tylko temu ze ich plik zaladowales. Potrzebujesz obiekt to go tworzysz, a nie 1000 globalnych obiektow, nie wiadomo przez co i kiedy uzywanych. A co jak bedziesz potrzebowal 2 obiekty tej samej klasy? Skoro juz 2 to drugi bedziesz i tak musial uzyc operatora new, to czemu od poczatku go tak nie wykorzystac?


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
Armageddon
post
Post #10





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 18.03.2007

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


Dobra, stworzyłem sobie mini-system MVC na PHP5 i przyznam, że dotychczasowe problemy minęły winksmiley.jpg

Dzięki wszystkim... guitar.gif
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 Aktualny czas: 20.08.2025 - 09:10