Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Prawidlowe wykorzystanie OOP w PHP
Forum PHP.pl > Forum > PHP > Object-oriented programming
DBR
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 :)
Crozin
Ad. 1. Dobrze rozumiesz. Metody statyczne to metody klas. Jednakże OOP skupione jest wokół obiektów, nie klas, tak więc mając zadanie usunięcia zdjęcia użytkownika powinieneś poprosić obiekt odpowiadający za zarządzanie zdjęciami użytkownika o usunięcie go.
Ad. 2. Metod i właściwości statycznych trzeba używać z dużą rozwagą. Generalnie jest bardzo niewiele miejsc gdzie są one potrzebne.
Ad. 3. Powinieneś korzystać z metod dostępowych. Jeżeli gdzieś masz kilkadziesiąt właściwości to pierwsza oznaka, że coś źle zaprojektowałeś. Zresztą generowaniem tych metod zajmie Ci się IDE, nie będziesz musiał tego klepać.
Ad. 4. Jeżeli aktualizacja to oznacza, że sam użytkownik już istnieje, racja? Pobierasz sobie obiekt aktualizowanego użytkownika, wprowadzasz w nim zmiany, zapisujesz. A samym zapisem powinien zająć się już inny obiekt.

Ogólnie jeżeli chodzi o operacje na obiektach reprezentujących dane w bazie typu MySQL musisz wykorzystać jakiegoś ORM-a. Na napisanie własnego nie masz w tej chwili szans, tak więc skorzystaj z Doctrine w wersji drugiej (na chwilę obecną niestety chyba jedyny ORM dla PHP mający sensowną architekturę - z obiektowego punktu widzenia).
by_ikar
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
}
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.