Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Automatyczna deklaracja kilku klas na raz
Forum PHP.pl > Forum > PHP > Object-oriented programming
zephyr7
Piszę prosty VC framework (zamiast M mam tylko klasę do przetwarzania sql),

Jak zainicjować wiele klas na raz?

Czy poniższy kod jest bezpieczny?

//podaję listę klas do zainicjowania
$uses=array('db','form','validate'....);

foreach ($uses as $cls){

$cls=substr(strip_tags(strtolower($cls)),0,25);
include_once CLASSES.$cls.'_class.php';

//chodzi mi szczególnie o tą linjkę....
eval ('$'.$cls.'= new '.$cls.';');

}



Co chcę zrobić? Chcę w dowolnym miejscu programu wpisać np. $db->get("username"), bez konieczności tworzenia ręcznie $db=new db;

Jeśli mam 20 klas, ręczne definiowanie wszystkiego wygląda kretyńsko...

Z drugiej strony, korzystanie w eval, jak wyżej również...


Czy jest jakiś prostszy sposób? Wiem, że funkcją __autoload można zastąpić include, ale czy jest analogiczna funkcja od razu deklarująca klasę? (np. $db=new db;)

z góry dzięki za pomoc


Crozin
Przekazywanie zależności to dosyć szeroki temat. Możesz wykorzystać np. bardzo popularny Dependency Injection Container (tutaj przykładowa implementacja: http://components.symfony-project.org/dependency-injection/)

PS. Użycie eval() jest bardziej kretyńskie niż pisanie 50 razy $abc = new Abc(); (przy czym takie każdorazowe pisanie np. $db = new Db() wskazuje na błąd w założeniach projektu).
zephyr7
Dzięki za odpowiedź!

Ale nie mogę oprzeć się wrażeniu, że to taka trochę sztuka dla sztuki.


Może da się prościej?

Chodzi o sposób zdeklarowania głównych funkcji systemu, takich jak obsługa bazy danych, formularze.

Więc z mojego punktu widzenia kretyństwo z eval ma sens, bo podaję tylko czego używam i już mam podane na tacy dla całego projektu.

Czy to bezpieczne?

i czy da się prościej?

żeby nie było, że jestem śmierdzącym leniem, a może tak?

function __autoload($cls){
include CLASSES.$cls.'_class.php';
}

db::get();
Mephistofeles
Nie, eval nie ma sensu, jego stosowanie z reguły oznacza zły projekt.
Od tego jest autoloader i tak jak pisał Crozin dependency container (ten z Symfony jest bardzo dobry).
zephyr7
żeby nie było, że jestem śmierdzącym leniem, może tak lepiej?

function __autoload($cls){
include CLASSES.$cls.'_class.php';
}
db::get();
Moli
W przykładzie który podałeś autoload jest Ci zupełnie niepotrzebne smile.gif
zephyr7
Ehm... no przecież te klasy trzeba jakoś zainkludować smile.gif

bez autoloada wyskoczy babol!
destroyerr
Być może jestem upierdliwy, ale co do tego ma deklaracja klasy? Przecież Ty chcesz w sposób masowy utworzyć instancje. Jak zamierzasz przekazywać dane do konstruktorów?

Cytat
Jeśli mam 20 klas, ręczne definiowanie wszystkiego wygląda kretyńsko...

Tak? Dlaczego?

Na moje oko to szukasz sposobu na ułatwienie sobie pracy, wykorzystując do tego programowanie obiektowe. W tym przypadku łatwiej będzie Ci chyba programować strukturalnie i używać funkcji, np.:
  1. db_get('username');

Jeszcze krócej i nie wygląda kretyńsko i nie ma zmiennych globalnych. Pomysł podobny do Twojego z wykorzystywaniem funkcji statycznych.

Co do problemu, czyli utworzenia instancji, to po co eval?
  1. $$class = new $class();

Można też tak.

Oprócz DIC, możesz też wykorzystać kontekst, albo rejestr (kolejność nieprzypadkowa).
Dipter
Według mnie, i jest to chyba jeden z lepszych sposób to jak wyżej Destroyerr napisał rejestr. Do tego jakiś prosty loader bibliotek. Załóżmy tworzysz metodę, która dodaje do tablicy wszystkie znalezione biblioteki .php w katalogu "x", a potem je tylko ładujesz. Rejestr - Dodajesz tu obiekty, które Ci są obecnie potrzebne. Lub też możesz zamiast rejestru korzystać z singletonów. Jak wolisz - do twojej dyspozycji.
Mephistofeles
Rejestr na pewno nie jest jednym z lepszych sposobów. Jak dla mnie po prostu przy takich założeniach projekt jest z dupy wzięty.
Dipter
Dlaczego niby tak sądzisz? Sorry, ale "z dupy" wzięty do dla mnie nie argument, to prawie tak jakbyś powiedział "bo tak" :/
Oczywiście to twoje zdanie, i masz do tego prawo, ale chciałbym wiedzieć dlaczego tak uważasz.
Mephistofeles
1. Bo jeśli każdą klasę da się zastąpić funkcją, to jest to tylko opakowanie na funkcje.
2. Popatrz w kod popularnych frameworków, tam jest to wszystko sensownie rozwiązane - użyte są np. wzorce Factory (choćby symfony), Dependency Injector (Symfony 2) i inne tego typu. Co to za framework, w którym klasy są inicjowane przez jakiś centralny plik na sztywno?
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.