zephyr7
22.12.2010, 21:11:27
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
22.12.2010, 21:45:08
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
22.12.2010, 22:35:40
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
22.12.2010, 22:35:56
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
22.12.2010, 22:36:23
żeby nie było, że jestem śmierdzącym leniem, może tak lepiej?
function __autoload($cls){
include CLASSES.$cls.'_class.php';
}
db::get();
Moli
23.12.2010, 13:42:59
W przykładzie który podałeś autoload jest Ci zupełnie niepotrzebne
zephyr7
23.12.2010, 16:29:34
Ehm... no przecież te klasy trzeba jakoś zainkludować

bez autoloada wyskoczy babol!
destroyerr
23.12.2010, 18:23:46
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.:
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?
$$class = new $class();
Można też
tak.
Oprócz DIC, możesz też wykorzystać kontekst, albo rejestr (kolejność nieprzypadkowa).
Dipter
24.12.2010, 18:47:06
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
24.12.2010, 20:04:16
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
24.12.2010, 20:59:46
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
24.12.2010, 22:08:42
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.