Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Automatyczna deklaracja kilku klas na raz, ja zainicjować wiele klas hurtowo...
zephyr7
post
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


Go to the top of the page
+Quote Post
Crozin
post
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).
Go to the top of the page
+Quote Post
zephyr7
post
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();
Go to the top of the page
+Quote Post
Mephistofeles
post
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).
Go to the top of the page
+Quote Post
zephyr7
post
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();
Go to the top of the page
+Quote Post
Moli
post
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 smile.gif
Go to the top of the page
+Quote Post
zephyr7
post
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ć smile.gif

bez autoloada wyskoczy babol!
Go to the top of the page
+Quote Post
destroyerr
post
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.:
  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).
Go to the top of the page
+Quote Post
Dipter
post
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.
Go to the top of the page
+Quote Post
Mephistofeles
post
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.
Go to the top of the page
+Quote Post
Dipter
post
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
Go to the top of the page
+Quote Post
Mephistofeles
post
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?
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: 19.08.2025 - 15:22