konto usunięte

Temat: OOP - Tworzenie nowych obiektów wewnątrz klasy i memory leak

Cześć,

Nie wiem, czy temat był poruszany, bo dokładnie nie wiem jak go nazwać.
Z góry mówię - darujcie sobie lincz, nie jestem ekspertem od programowania obiektowego.

Mam sobie taką klasę, która jest kontrolerem, w __construct() chcę utworzyć obiekty klas użytkowników oraz smarty. Wygląda to tak:


class controller {

var $smarty;
var $user;

function __construct() {
$this->user = new user;
$this->smarty = new smarty;

[.............]



Dopóki miałem samo dodawanie obiektu smarty, wszystko działało poprawnie.
Po dodaniu drugiego obiektu (w tym przypadku user) lub jakiegokolwiek innego obiektu drugiej klasy, wszystko się sypie:


Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 261904 bytes) in C:\xampp\htdocs\x\class\class.controller.php on line 11

[/code]

Po zakomentowaniu jednej z nich, wszystko działa.

Mam na localu PHP w wersji 5.3.8.

Jak to opanować?

konto usunięte

Temat: OOP - Tworzenie nowych obiektów wewnątrz klasy i memory leak

Ok juz sobie poradziłem temat do zamkniecia lub wywalenia.


function __construct() {
$this->user = new user($this);
$this->smarty = new smarty($this);




class user extends controller {
function __construct($parent = NULL) {
$this->parent = $parent;
}
function __destruct() {
unset($this->parent);
}


Musze taka obsluge destruktora i konstruktora dodawac w kazdej nastepnej tworzonej przez kontroler klasie?
Piotr Jasiulewicz

Piotr Jasiulewicz PHP/Java
professional

Temat: OOP - Tworzenie nowych obiektów wewnątrz klasy i memory leak

1. to nie memory leak ;)
2. Jak podajesz kod z "linii X masz blad" to podaj kod z liniami:-)
3. Wyprodukowales kod nadajacy sie do zabicia, nie mam pojecia po co dajesz referencje kontrolera do usera, ale (na pewno) robisz cos co nie ma najmniejszego sensu.
4. Zmniejsz pamiec, 128MB dla prostego skryptu to juz na dziendobry problem wydajnosci (nie bez powodu domyslnie jest 16MB zdaje sie)Piotr Jasiulewicz edytował(a) ten post dnia 28.09.12 o godzinie 15:10
Artur Świerc

Artur Świerc Programista PHP/Java

Temat: OOP - Tworzenie nowych obiektów wewnątrz klasy i memory leak

popracuj nad stylem, zobacz jak są pisane biblioteki frameworków. Var było za czasów php4.
Zobacz w innych frameworkach jak zachowuje się front controller.
Krzysztof N.

Krzysztof N. CEO. Aplikacje
internetowe i
mobilne. Symfony,
Zend.

Temat: OOP - Tworzenie nowych obiektów wewnątrz klasy i memory leak

Jakub, linczu nie będzie, ale nasuwa się wniosek: użyj gotowego rozwiązania lub zleć wykonanie tej funkcjonalności profesjonalistom, bo inaczej takie kwiatki zabiorą Ci mnóstwo czasu i nerwów.

konto usunięte

Temat: OOP - Tworzenie nowych obiektów wewnątrz klasy i memory leak

Ale może jeśli nie powalczę trochę z kwiatkami, nigdy nie nauczę się kodować obiektowo.. przeglądam różne teksty, tutoriale, kod źródłowy różnych systemów, ale nadal w 70% jest to dla mnie niełatwe ;-) może rozejrzę się za jakas literatura
Piotr Jasiulewicz

Piotr Jasiulewicz PHP/Java
professional

Temat: OOP - Tworzenie nowych obiektów wewnątrz klasy i memory leak

No to zacznik od ksiazek, zamiast rozwiazan troche na slepo, w koncu trafisz, ale zajmie Ci lata;-)

Zeby pisac schludny kod ktory po roku z przyjemnoscia obejrzysz:
http://helion.pl/ksiazki/czysty-kod-podrecznik-dobrego...

Zeby rozumiec kiedy czego uzyc (OOP/OOD)
http://helion.pl/ksiazki/php5-obiekty-wzorce-narzedzia...

Obie to imho jedne z lepszych ksiazek w gatunku... niemniej jednak i tak zajmie Ci to pare lat, pamietaj tez, ze nie warto meczyc sie w towarzystwie (pracujac z) ludzmi z duza ignorancja dla tematu, bo w ten sposob uczysz sie znacnzie wolniej. Na poczatku znacznie wiecej doswiadczenia zdobywa sie czestszymi zmianami pracy.
Krzysztof N.

Krzysztof N. CEO. Aplikacje
internetowe i
mobilne. Symfony,
Zend.

Temat: OOP - Tworzenie nowych obiektów wewnątrz klasy i memory leak

Jakub Świegot:
przeglądam różne teksty, tutoriale, kod źródłowy różnych systemów, ale nadal w 70% jest to dla mnie niełatwe ;-) może rozejrzę się za jakas literatura
Zerknij też na tematy jakie pojawiają się na GoldenLine. Jest ich wiele. Przykłady:
-> książka PHP
-> nauka php dla poczatkującego
-> Nauka PHP dla młodej osobyKrzysztof N. edytował(a) ten post dnia 29.09.12 o godzinie 12:41

konto usunięte

Temat: OOP - Tworzenie nowych obiektów wewnątrz klasy i memory leak

@Krzysztof Nizioł: Chyba mnie w ogóle nie kojarzysz... Ja ogólnie koduję w PHP już ponad 6 lat, jedynie do PHP w wersji obiektowej przymierzałem się już kilka razy i za każdym razem się zniechęcam po pewnym czasie... o to tylko chodzi ;-) A Ty mi tu podstawy podsuwasz... bez przesady :)
Krzysztof N.

Krzysztof N. CEO. Aplikacje
internetowe i
mobilne. Symfony,
Zend.

Temat: OOP - Tworzenie nowych obiektów wewnątrz klasy i memory leak

Jakub Świegot:
ogólnie koduję w PHP już ponad 6 lat, jedynie do PHP w wersji obiektowej przymierzałem się już kilka razy i za każdym razem się zniechęcam po pewnym czasie... o to tylko chodzi ;-) A Ty mi tu podstawy podsuwasz... bez przesady :)
To proste: poszukaj podstaw dotyczących programowania obiektowego, a następnie obiektowego w PHP.

Poza tym znajdź przyczynę, która Cię zniechęca i... usuń :]
Piotr Jasiulewicz

Piotr Jasiulewicz PHP/Java
professional

Temat: OOP - Tworzenie nowych obiektów wewnątrz klasy i memory leak

6 lat bez OOP... ała :)

konto usunięte

Temat: OOP - Tworzenie nowych obiektów wewnątrz klasy i memory leak

O wzorcach projektowych:
http://marioosh.5dots.pl/category/wzorce-projektowe
http://sourcemaking.com/design_patterns
http://www.fluffycat.com/

O programowaniu obiektowym:
http://sebastian-malaca.blogspot.com/2012/06/jak-progr...

Jeżeli chodzi o OOP, to problem polega na tym, że jest niewiele materiałów, które rzeczywiście uczą, jak programować obiektowo.
Zazwyczaj artykuły są skierowane do osób, które już posiadają jakąś wiedzę na temat OOP, a te które są dla początkujących traktują jedynie o konstrukcjach (klasa, abstrakcja, interfejs itp. ) nie mówiąc nic o tym, w jaki sposób ich poprawnie używać.
Piotr Jasiulewicz

Piotr Jasiulewicz PHP/Java
professional

Temat: OOP - Tworzenie nowych obiektów wewnątrz klasy i memory leak

True, więc practice, practice, practice ;)

konto usunięte

Temat: OOP - Tworzenie nowych obiektów wewnątrz klasy i memory leak

Piotr Jasiulewicz:
6 lat bez OOP... ała :)

Da się, uwierz mi :) Poza tym kod nie jest proceduralny ani śmieciowy, tylko budowany na klasach i szablonach, z prostym kontrolerem wywołującym metody klas. Jedynie schody zaczynają się przy tworzenie obiektów, to strukturę kodu to ja utrzymuję w klasach, natomiast (nie zawsze) pewne elementy nie są tworzone jako obiekty, tylko wywołania funkcji. Ot tak to właśnie wygląda.

prościej mówiąc:

zamiast robić
$obiekt->to();
$obiekt->tamto();
$obiekt->Siamto();
$obiekt->OdpalajTaMaszyne($obiekt);

to robilem cos w stylu:

$result = $obiekt->OdpalajTaMaszyne($to, $tamto, $siamto);

;-)

roznica polega na tym, ze taki kod jest trudny w utrzymaniu, gdy czesto zmieniaja sie zalozenia projektu, bo takie definiowanie parametrow funkcji nie jest za dobre.
Chcialem sie z tego przesiąść, no i praktycznie na poczatku juz pogubilem sie z tworzeniem obiektow wewnatrz klasy i ich obsługa.Jakub Świegot edytował(a) ten post dnia 01.10.12 o godzinie 09:47

konto usunięte

Temat: OOP - Tworzenie nowych obiektów wewnątrz klasy i memory leak

Jakub Świegot:
Piotr Jasiulewicz:
6 lat bez OOP... ała :)

Da się, uwierz mi :) Poza tym kod nie jest proceduralny ani śmieciowy, tylko budowany na klasach i szablonach, z prostym kontrolerem wywołującym metody klas. Jedynie schody zaczynają się przy tworzenie obiektów, to strukturę kodu to ja utrzymuję w klasach, natomiast (nie zawsze) pewne elementy nie są tworzone jako obiekty, tylko wywołania funkcji. Ot tak to właśnie wygląda.

prościej mówiąc:

zamiast robić
$obiekt->to();
$obiekt->tamto();
$obiekt->Siamto();
$obiekt->OdpalajTaMaszyne($obiekt);

to robilem cos w stylu:

$result = $obiekt->OdpalajTaMaszyne($to, $tamto, $siamto);

;-)

roznica polega na tym, ze taki kod jest trudny w utrzymaniu, gdy czesto zmieniaja sie zalozenia projektu, bo takie definiowanie parametrow funkcji nie jest za dobre.
Chcialem sie z tego przesiąść, no i praktycznie na poczatku juz pogubilem sie z tworzeniem obiektow wewnatrz klasy i ich obsługa.

No i to właśnie jest zła praktyka. Żeby programować obiektowo trzeba zrozumieć programowanie obiektowe. Fajne jest OdpalajTaMaszyne($to, $tamto, $siamto); ale na dobrą sprawę nie zrobiło by Ci różnicy między tym a zrobieniem funkcji która jest olbrzymim blokiem kodu którą gdzieś odpalasz. A jak używasz to w 1 miejscu to na dobrą sprawę trzeba było bezpośrednio wkleić blok kodu i zapomnieć o sprawie.

To jak z ludźmi. Potrafię skakać więc dla mnie wygląda to tak:
$Darek->skacz();


Nie jestem cyrkowcem więc nie robię czegoś takiego:
$Darek->skacz_na_linie_trzymajac_tyczke_2piwa_z_rowerem_na_nosie_i_petarda_w_du_ie();


Rozumiesz o co mi chodzi ? Dlatego kiedy sam pisałem o programowaniu obiektowym w Dzienniku Internautów to starałem się to robić pozbywając się pompatycznego technicznego języka i wyjaśniając różnorakie terminy na ile tylko mogłem (DI nakłada mi kaganiec w postaci długości tekstu ale to akurat zrozumiałe) tak by ludzie załapali o co chodzi nie mając doświadczenia z OOP.

Dlatego pisząc tutaj:
http://di.com.pl/porady/35024,0,PHP_Programowanie_obie...

http://di.com.pl/porady/36200,0,PHP_Programowanie_obie...

Starałem się dawać do zrozumienia że każda czynność powinna mieć jedną metodę a jeżeli chcesz wprowadzić sekwencję czynności tak jak to pokazałeś tutaj:


$obiekt->to();
$obiekt->tamto();
$obiekt->Siamto();
$obiekt->OdpalajTaMaszyne($obiekt);


i koniecznie chcesz mieć zbiorczą metodę to powinieneś zrobić to tak:

class Maszyna() {
public function to($to) { /* KOD */ }
public function tamto($tamto) { /* KOD */ }
public function siamto($siamto) { /* KOD */ }
public function odpal() { /* KOD */ }

public function OdpalajTaMaszyne($to, $tamto, $siamto) {
$this->to($to);
$this->tamto($tamto);
$this->siamto($siamto);
$this->odpal();
}
}


W ten sposób jak siamto() zacznie szwankować to nie rozdłubujesz całej metody ale naprawiasz siamto(). Masz jasno rozdzieloną odpowiedzialność a całość powinna być dość logiczna. A przy okazji jak z jakiegoś powodu ktoś będzie chciał odpalić maszynę bez siamto() to będzie mógł to zrobić bez hakowania kodu klasy Maszyna bez powodu tylko wystartujesz ją z poszczególnych metod, wykonując kolejne kroki i pomijając siamto() zamiast pełnej procedury o nazwie "OdpalTaMaszyne".


$obiekt->to();
$obiekt->tamto();
//$obiekt->Siamto();
$obiekt->odpal();


Więc jeżeli masz zamiar się trzymać swojego "stylu" to najlepiej daj sobie siana z programowaniem obiektowym i zostań przy stosowaniu funkcji lub spróbuj czegoś innego. Bo to co robisz to nie programowanie obiektowe. To program który ma w sobie obiekty (program z obiektami =/= programowanie obiektowe tak jak ubranie baletek nie czyni Cie baletnicą).

W skrócie - Twoim problemem jest przede wszystkim brak umiejętności programowania obiektowego mimo że starasz się je stosować. Jeżeli chcesz przesiąść się z piły ręcznej na motorową - przeczytaj instrukcję


Obrazek


Inaczej skończy się to źle co zresztą już zauważyłeś chyba.Dariusz Półtorak edytował(a) ten post dnia 01.10.12 o godzinie 10:21
Piotr Jasiulewicz

Piotr Jasiulewicz PHP/Java
professional

Temat: OOP - Tworzenie nowych obiektów wewnątrz klasy i memory leak

@Jakub
To nie ma byc usczypliwe oczywiscie. Wypowiedz, ktora slysze dosc czesto, wynikajaca z braku doswiadczenia z OOP - jest dokladnie przeciwnie, tyle ze jak z jezdzeniem rowerem, na poczatku jest trudniej gdzies dotrzec, zamiast latwiej, a po jakims czasie "patcz toto, jade bez czymanki!".
Nie martw sie jednak bo bardzo czesto programisci wymieniaja plusy OOP jako jego minusy (e.g. ciezko utrzymac) Przypomina mi troche rant z linuxa przez kogos, kto go nie rozumie/nie uzywal. Nie jestes wiec odosobniony w swoim cierpieniu.

Twoj przyklad kodu pokazuje, ze chyba tez nie do konca rozumiesz co to OOP, bo costam widze macie, caly problem polega jednak na tym, ze nie rozumiecie co wiec robi sie "randomowo", raz wyjdzie, raz nie. Pamitaj ze uzycie "new" nie robi z kodu obiektowego, a zrozumienie jakie techniki zastosowac, aby zmniejszyc jego koszt do minimum.

Imho idziesz w odwrotnym kieryunku do tego dobrego, w tym zlym znaczy sie. Roznica polega na tym, ze taki kod ciezko / nie da sie testowac. Patrzac po profilu, jestes kierownikiem IT, wiec pewnie masz pare osob, ktore zamiast tworzyc kod, ktory pisze sie raz, ma fun w testowaniu regresyjnym "manualnie" i popularnym "przeklikiwaniu sie".
Wyobraz sobie, ze zamist przy kazdym projekcie tworzyc element ktory sluzy do logowania, includujesz wlasna, przetestowana biblioteke (nie mylic z kopiujesz i hackujesz), czytasz wlasna dokumentacje, aby przypomniec sobie jak sie tego uzywalo i masz cos w 10 minut zamiast tydzien.

Niestety przy takim modelu (a ma go bardzo duzo firm w PL niestety, w UK tez z reszta) ciezko zauwazyc jest ze droga programu jest "f£$%^ up driven development" wiec od buga do buga - bo przeciez "tak sie u nas w firmie robi".

Do tego dochodzi, ze nikt nigdy nie wie dlaczego kod jest lepszy niz inny (OOP niz "random engineering") z powodu:
- nikt tego nie mierzy, aby cos wiedziec, trzeba zmierzyc co sie dzieje gdy...
- malo kto porownuje wykorzystanie, nie ma niczego co jest bezwzglednie dobre/zle, a jedynie rzeczy, ktore sa lepsze i gorsze w konkretnym przypadku.

Uwierz, nikt nie zaczal od OOP/OOD bo to nie sa trywialne koncepty do zrozumienia, wymagajace lat. Jednak jak mozna sie domyslic, kazdy kiedys byl tam gdzie ty... i nie bez powodu nie jest, moze wiec jednak cos w tym jest?

A jesli chodzi o zmiany, to "no shit dude"... :) jedyna firma na swiecie, ktora ma zmiany w trakcie trwania projektu ;-) Ja pisze gry, ktorych glownym zalozeniem jest "ma byc fun", myslisz ze fun sa sie zaplanowac w dokumentacji projektowej?Piotr Jasiulewicz edytował(a) ten post dnia 01.10.12 o godzinie 13:42

Następna dyskusja:

OOP - te same pole kilku o...




Wyślij zaproszenie do