 |
Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc Comunitatea PHP Romania
|
| Subiectul anterior :: Subiectul următor |
| Autor |
Mesaj |
adix
Data înscrierii: 02/Oct/2007
Mesaje: 123
|
| Trimis: Dum Aug 03, 2008 5:43 pm Titlul subiectului: Extinderea dinamica a unei clase |
|
|
Salut.
Uite, lucrez de ceva vreme la proiectarea unui framework pentru un proiect mare, diferit, ciudat si provocator.
Momentan proiectam aplicatia, si ca de obicei, proiectarea imi cade mie in cap.
Ce vreau de fapt: sa extind o clasa dinamic, in timpul rularii scriptului.
Asadar, presupunem ca avem o clasa "main_class" si o alta clasa "do_something_class".
Intotdeauna am creata clasa "main_class", si la un moment dat, in functie de modul, am nevoie si de "do_something_class"
ce vreau sa fac este ceva in genul:
Cod: $main_class->load('do_something_class');
Ca urmare, toate membrele "do_something_class" devin accesibile prin $main_class
Precizez ca nu vreau do_something_class extends main_class.
Totul este gandit pentru eficienta, load time si consum de resurse.
Nu ne trebuie nici un fel de framework consacrat. Totul este de la zero (stipulat prin contract)....
Asadar, vreo idee? Am facut research, stiu ca este posibil, ce am gasit este varza insa, nu te duce unde vrei.
Cer ajutor pentru a scurta dn timpul rezolvarii problemei, sunt perfect competent sa gasesc o solutie, dar ar dura, si timpul, ehehe, timpul...
mandriva: STAI DEPARTE DE THREADUL ASTA. |
|
| Sus |
|
vectorialpx
Data înscrierii: 01/Mar/2005
Mesaje: 3001
Locație: țopăi pe tasta DELETE
|
| Trimis: Dum Aug 03, 2008 6:07 pm Titlul subiectului: |
|
|
Citat: Precizez ca nu vreau do_something_class extends main_class.
de ce? cum crezi ca optimizezi un script ocolind o solutie simpla? :) |
|
| Sus |
|
mihaitha
Data înscrierii: 04/Mai/2007
Mesaje: 1762
Locație: Sibiu
|
| Trimis: Dum Aug 03, 2008 6:16 pm Titlul subiectului: |
|
|
| Am o idee, dar trebuie sa mai studiez putin. Iti dau un raspuns maine daca nu te rezolva nimeni pana atunci. |
|
| Sus |
|
andrei009
Data înscrierii: 16/Mar/2007
Mesaje: 211
|
| Trimis: Dum Aug 03, 2008 7:14 pm Titlul subiectului: |
|
|
uite aici, am facut eu mai demult
do_something.php
Cod: class do_something {
function ha(){
echo 'ha';
}
}
index.php
Cod: class main_class {
function load($l){
include $l.'.php';
$this->$l = new $l;
}
}
$main = new main_class;
$main->load('do_something');
$main->do_something->ha();
foloseam asta pentru a incarca clasele doar cand aveam nevoie de ele, sa nu le incarc pe toate la inceput
later edit: codul l-am scris acum, la metoda load ar trebui puse cateva if-uri, daca fisierul si clasa exista
http://php.net/file_exists
http://php.net/class_exists |
|
| Sus |
|
Amenthes
Data înscrierii: 12/Dec/2005
Mesaje: 577
|
| Trimis: Dum Aug 03, 2008 9:15 pm Titlul subiectului: |
|
|
Vezi daca te ajuta ce am zis aici:
http://phpromania.net/forum/viewtopic.php?t=15679
Later edit:
Ma indoiesc insa ca asa ceva se va comporta cum vrei tu ("Totul este gandit pentru eficienta, load time si consum de resurse."). Cand vrei lucruri asa dinamice, mai ai si de suferit, vezi Ruby. Si ar mai fi o problema, nu stiu cat de corect din punct de vedere OO este o asemenea abordare. |
|
| Sus |
|
adix
Data înscrierii: 02/Oct/2007
Mesaje: 123
|
| Trimis: Lun Aug 04, 2008 8:49 am Titlul subiectului: |
|
|
Initial am proiectat totul conform cu metoda lui andrei009.
Insa ma gandeam sa sharez membre dintre clase diferite prin intermediul aceluiasi container (main_class).
O solutie gasita este http://codingforums.com/showthread.php?t=100806. Si ar mai fi si in ZEND framework o chestie asemanatoare.
Intradevar, Amenthes, incarcarea claselor in modul asta nu e cea mai rapida, dar incarcarea unei clase o faci o singura data. Optimizarea de care vorbesc este la restul sistemului. Dela la sistemul de caching si query pana la modul de tratare a templateurilor. |
|
| Sus |
|
acid28
Data înscrierii: 04/Aug/2008
Mesaje: 1
|
| Trimis: Lun Aug 04, 2008 10:00 pm Titlul subiectului: |
|
|
Citat: Ce vreau de fapt: sa extind o clasa dinamic, in timpul rularii scriptului.
Daca asta e intr-adevar ce vrei sa faci (desi urmarind postul se pare ca de fapt nu asta vrei sa faci) ... raspunsul este Decorator pattern.
Citat: In object-oriented programming, the decorator pattern is a design pattern that allows new/additional behaviour to be added to an existing class dynamically |
|
| Sus |
|
Kine
Data înscrierii: 09/Aug/2008
Mesaje: 11
|
| Trimis: Sâm Aug 09, 2008 6:55 pm Titlul subiectului: |
|
|
O alternativa la ceea ce doresti sa faci este 'Factory pattern': sa incarci o clasa conditional (cam asa lucreaza PDO-ul de la PHP) prin intermediul altei clase.
Pentru mai multe detalii: (cauta Factory pe Wikipedia) - am vrut sa dau link, dar se pare ca inca nu indeplindesc toate criteriile.
Zend framework foloseste un astfel de pattern pentru returnarea unei instante catre o conexiune cu o baza de date. |
|
| Sus |
|
PHPRomania Bot
Bot Member
Data înscrierii: 27/Dec/2007
Mesaje: 1
Locaţie: Server Google |
| Trimis: Mie Dec 26, 2007 7:01 pm Titlul subiectului: Ad |
|
|
|
|
|
| Sus |
|
| |
|