Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php4][oop] Autoodpalanie klas
Forum PHP.pl > Forum > PHP > Object-oriented programming
Armageddon
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
likemandrake
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. ?>
bim2
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. ?>
likemandrake
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.
mike
~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?
Armageddon
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
phpion
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
wrzasq
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...
dr_bonzo
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?
Armageddon
Dobra, stworzyłem sobie mini-system MVC na PHP5 i przyznam, że dotychczasowe problemy minęły winksmiley.jpg

Dzięki wszystkim... guitar.gif
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.