Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Prawidlowe wykorzystanie OOP w PHP
DBR
post
Post #1





Grupa: Zarejestrowani
Postów: 24
Pomógł: 1
Dołączył: 17.08.2011

Ostrzeżenie: (0%)
-----


staram sie ostatnio pisac bardziej obiektowo, czytam ksiazki, tutoriale itd ale mam kilka watpliwosci i sprzecznych informacji i przydaloby mi sie troche rady bardziej doswiadczonego programisty. mianowicie:

1. rozumiem ze metody do ktorych odwoluje sie w postaci :: to metody klas ktore nie wymagaja tworzenia obiektu. czy np majac za zadanie dajmy na to usuniecie z bazy zdjecia ktore user ma w galerii, zmiana zdjecia glownego czy jakies inne operacje moge po prostu w funkcji miec User::setProfilePhoto($userid, $photoid) czy lepiej tworyc usera przez new i uzywac $user->setProfilePhoto();

2. ogolnie nie bardzo rozumiem kiedy tworzyc nowy obiekt i wykonywac na nim jakies operacje, a kiedy robic cos wlasnie przy pomocy tego sposobu z ::. prosilbym o jakies lopatologiczne wyjasnienie bo jest na razie dla mnie plynne i czasem nie czuje roznicy.

3. duzo tutoriali mowi o uzywaniu getCostam i setCostam, aby pobierac i ustawiac parametry obiektu, aby nie stosowac w skrypcie $user->name = 'Zenon'; ten sposob jest bardziej elegencki i bezpieczny... ale tak sobie mysle ze mam np zmiane danych usera, ktory ma kilkanascie, czy dziesiat jakichs parametrow (imie, nazwisko, plec itd) i mam za kazdym razem uzywac tych funkcji? patrze na jakies projekty open source i tam bez kozery uzywaja bezposredniego przypisania parametrow i nie korzystaja z tych getow i setow. ktora szkola jest odpowiednia? a moze wszystko zalezy od projektu, jesli tak to od czego dokladnie?

4. i konkretny przyklad, ktory w zasadzie jest podsumowanie powyzszych pytan. mam update danych usera. dane leca sobie postem, miele je w jakiejs funkcji validujacej, potem uruchamiam funkcje ktora robi update. i co dalej w tej funkcji?

a) stworzenie obiektu $user przez new, przypisanie wszystkich parametrow z $_POSTa (przez set czy po prostu $user->name = 'Zenon'?) i potem $user->update() gdzie juz w klasie dokonuje sie tylko update?
b) czy moze po prostu w funkcji jakies User::update() i w klasie korzystajac z $this podpiecie wszystkiego z $_POSTa do obiektu i tam update do bazy.
c) jakis inny sposob?

pytania troche zakrecone ale nie daja mi spac i bede dzwieczny za wszelka pomoc kogos okielznanego w tym temacie :)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
by_ikar
post
Post #2





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


Ad.1 i Ad.2 Ostatnio właśnie koledze pokazywałem ciekawy przykład, dlaczego trzeba metod/zmiennych statycznych używać z rozwagą. Powiedzmy sobie masz klasę która zawiera metody statyczne, które ci w sumie przydadzą się w klasie bardzo podobnej, lecz tylko niektóre z nich nadpisujesz, więc sobie dziedziczysz tą klasę. najlepiej jak pokażę kawałek kodu:

Kod
<?php

class Foo
{
        public static $baz;
}

class Bar extends Foo
{
  
}

Foo::$baz = 'some';

var_dump(Bar::$baz);


Mimo że zmiennej $baz w obiekcie Bar nie przypisałeś żadnej wartości, zwróci ci "some". Żeby uciec od tego, można by zrobić tak:

Kod
<?php

class Foo
{
        public static $baz;
}

class Bar extends Foo
{
        public static $baz;
}

Foo::$baz = 'some';

var_dump(Bar::$baz);


Nadpisując zmienną, tyle że wówczas jaki sens ma dziedziczenie skoro musisz sporo rzeczy nadpisywać? Dlatego jest lepiej nie tworzyć klas statycznych, a obiekty chociażby wstrzykiwać jeden w drugi, dzięki temu nie trzeba nadpisywać zmiennych/metod w obiekcie żeby móc go "wyczyścić".

Ad.3 Jeżeli masz niewiele danych do zmiany, wiesz jakie te dane są, to możesz z powodzeniem używać getMethodName/setMethodName, jeżeli np tak jak napisałeś, chciałbyś zaktualizować usera, dobrze jest stosować jeden get, jeden set, jeden has itp. wtedy robisz to tak $user->get('pole'), $user->set('pole', 'wartosc') coś w ten deseń.

Ad.4 w samej aktualizacji już masz warunek który sprawdza czy zakończyło się to powodzeniem. W innym przypadku powiedzmy zwróci false i niech taki kod wygląda mniej więcej tak:

Kod
$updateResult = $user->update(array('pole' => 'wartosc', 'pole' => 'wartosc'));

if(!$updateResult)
{
  //... informujesz użyszkodnika że aktualizacja się nie powiodła
} else
{
//.. informujesz użyszkodnika że aktualizacja zakończyła się powodzeniem
}
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 26.12.2025 - 01:46