![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 71 Pomógł: 1 Dołączył: 3.11.2005 Ostrzeżenie: (0%) ![]() ![]() |
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 |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
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). |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 71 Pomógł: 1 Dołączył: 3.11.2005 Ostrzeżenie: (0%) ![]() ![]() |
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(); |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 1 182 Pomógł: 115 Dołączył: 4.03.2009 Skąd: Myszków Ostrzeżenie: (0%) ![]() ![]() |
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). |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 71 Pomógł: 1 Dołączył: 3.11.2005 Ostrzeżenie: (0%) ![]() ![]() |
żeby nie było, że jestem śmierdzącym leniem, może tak lepiej?
function __autoload($cls){ include CLASSES.$cls.'_class.php'; } db::get(); |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 662 Pomógł: 45 Dołączył: 26.03.2007 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
W przykładzie który podałeś autoload jest Ci zupełnie niepotrzebne
![]() |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 71 Pomógł: 1 Dołączył: 3.11.2005 Ostrzeżenie: (0%) ![]() ![]() |
Ehm... no przecież te klasy trzeba jakoś zainkludować
![]() bez autoloada wyskoczy babol! |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 879 Pomógł: 189 Dołączył: 14.06.2006 Skąd: Bytom Ostrzeżenie: (0%) ![]() ![]() |
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.:
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?
Można też tak. Oprócz DIC, możesz też wykorzystać kontekst, albo rejestr (kolejność nieprzypadkowa). |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 81 Pomógł: 14 Dołączył: 28.11.2010 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
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.
|
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 1 182 Pomógł: 115 Dołączył: 4.03.2009 Skąd: Myszków Ostrzeżenie: (0%) ![]() ![]() |
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.
|
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 81 Pomógł: 14 Dołączył: 28.11.2010 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
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. Ten post edytował Dipter 24.12.2010, 21:01:01 |
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 1 182 Pomógł: 115 Dołączył: 4.03.2009 Skąd: Myszków Ostrzeżenie: (0%) ![]() ![]() |
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? |
|
|
![]() ![]() |
![]() |
Aktualny czas: 19.08.2025 - 15:22 |