Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przykładowa aplikacja w PHP OOP
Forum PHP.pl > Forum > PHP > Object-oriented programming
gagatek
chciałbym przeglądnąć i przeanalizować kod aplikacji napisanej w php obiektowym. Wydaje mi się że w ten sposób najlepiej bym zrozumiał cały proces tworzenia aplikacji obiektowych. Chodzi mi o przesyłanie danych wyświetlanie ich obsługę bazy danych. Czy wiecie skąd można by było taką przykładową aplikacje podejrzeć, jak jest zbudowana i zaimplementowana?
com
google php oop examples mysql questionmark.gif
sf
Zacznij pisać używając jakiegoś frameworka to zrozumiesz jego budowę wink.gif Zend Framework (1 na start), Symfony czy Kohana...
gagatek
Cytat(com @ 28.12.2013, 17:48:09 ) *
google php oop examples mysql questionmark.gif

Tak, to już przeglądałem. Ale nie do końca się rozumiemy. Nie chodzi mi o jakieś fragmenty jak połączenie z bazą, tworzenie obiektu, zwierzęta, koty itd itp. Chodzi mi o konkretną apl żeby można było zobaczyć jak to wszystko wygląda w całości i żeby zobaczyć jak powinna wyglądać poprawnie zrobiona apl w obiektowym php, jak te wszystkie "części" aplikacji ze sobą współgrają.

Cytat(sf @ 28.12.2013, 17:49:44 ) *
Zacznij pisać używając jakiegoś frameworka to zrozumiesz jego budowę wink.gif Zend Framework (1 na start), Symfony czy Kohana...

Czy uważasz że lepiej zacząć obiektowe programowanie od razu od frameworka? Znajomy ma książke do ZF Pana Gajdy. Tylko właśnie czy lepiej zacząć od czystego PHP czy Frameworka?
pedro84
Najpierw zacznij od przyswojenia teorii, popartej czytaniem i analizowaniem kodu źródłowego.
com
Tak wgl to czym wdg Ciebie są frameworki? przecież one są pisane w tym samym php, jedynie zaimplementowany jest w nich model projektowy mvc, a ponadto na nich opiera się te Twoje konkretne aplikacje... a oop z samego kodu się nie nauczysz bo jego można napisać na tyle sposobów ile jest programistów.. Trzeba zrozumieć czym wgl ono jest a wtedy tego typu pytania nie bd przychodziły Ci do głowy smile.gif
gagatek
teorie, podstawy znam, ale chodzi mi o taki ogólny szkielet prawidłowo napisanej apl a OOp
Turson
No to właśnie zajrzyj do jakiegoś frameworka, bo tam można dobry przykład OOP
marcinek37
dołączam się do prośby - nie ma nic prostszego?
też szukam najbanalniejszego frameworka, w którym dla testu byłby tylko jeden moduł

próbuję pisać swój własny ( http://www.speedyshare.com/FHVGe/mvc.rar ), ale stanąłem na widokach i nie wiem co dalej :/
em1X
Laravel jest hitem ostatnich miesięcy...
http://laravel.com/docs/quick
zegarek84
Cytat(marcinek37 @ 21.01.2014, 18:49:29 ) *
próbuję pisać swój własny ( http://www.speedyshare.com/FHVGe/mvc.rar ), ale stanąłem na widokach i nie wiem co dalej :/

przepraszam, że nie mam czasu na przeglądanie kodu więc rzucę tylko hasłami jeśli chodzi o widoki gdzie samo PHP jest w sumie systemem szablonów i jako takie były jego pierwsze w sumie początki... luknij po prostu na poniższe tematy jako wstęp jeśli na siłę próbujesz zrozumieć co się dzieje w gotowych FW, a dalej po prostu skorzystaj z jakiegoś gotowca ;]
PHP Template, Includowanie pliku
[PHP]Podstawy obiektowości, na przykładzie bloga
marcinek37
generalnie w tym pliku: http://www.speedyshare.com/FHVGe/mvc.rar
wykorzystałem bardzo podobny kod, o którym pisałeś w jednym w tametów
ja jednak szukam pomysłu na jego lepsze wykorzystanie (bądź po prostu poprawne wykorzystanie)

1. powiedzmy, że mam dwa główne szablony:
- zielony.php
- niebieski.php

oba są tak naprawdę ramami strony, mają top, lewe i prawe menu, stopkę, a na środku (content) jest jedynie zmienna $content, która czeka na wartość

2. następnie mam kilka plików wizualnych, np. news.php albo info.php, w których jest div i kilka zmiennych typu $title, $text, $photo
controller ładuje plik wizualizacyjny newsa, za pomocą skryptu zmienne są zamieniane przez wartości "wyplute" przez model

3. dopiero wtedy to, o o czym mowa w punkcie 2. jest ładowane do tego, o czym mowa w punkcie 1.

i to mi się nie podoba, bo Twoja funkcja jest wykorzystywana dwukrotnie (dokładnie tak, jak w moim skrypcie, do którego linka podałem na początku postu)
oczywiście mógłbym to zignorować i budować aplikację dalej, ale sądzę, że jak w końcu postanowiłem porządnie programować, to nie mogę sobie na to pozwolić
em1X
Jak szukasz lepszych/poprawnych, to przestań pisać własne rozwiązania i wynajdywać koło od początku, tylko skorzystaj z gotowych/sprawdzonych/testowanych rozwiązań.
marcinek37
rozumiem, czyli Wy robicie dokładnie tak samo?
w kontrolerze ładujecie widok contentu, zamieniacie zmienne na wartości "wyplute" przez model
następnie całość wysyłacie również w kontrolerze do ogólnych ram szablonu?

piszę coś swojego od podstaw i nie chcę na samym początku zrobić mega bubla
zegarek84
Cytat(marcinek37 @ 23.01.2014, 14:20:39 ) *
...
i to mi się nie podoba, bo Twoja funkcja jest wykorzystywana dwukrotnie (dokładnie tak, jak w moim skrypcie, do którego linka podałem na początku postu)
oczywiście mógłbym to zignorować i budować aplikację dalej, ale sądzę, że jak w końcu postanowiłem porządnie programować, to nie mogę sobie na to pozwolić

włączać/wyłączać szablon/widok, zagłębiać szablony/widoki możesz tylko buforując strumienie wyjścia przez ob_start itd... przejrzyj kody źródłowe popularnych FW klas z widokami które dają znacznie większe możliwości ale też i są znacznie bardziej rozbudowane... jak dokopiesz się do podstawowych rozwiązań znajdziesz tam kombinację ob_start itd...

OOP - to programowanie zorientowane obiektowo, wykonywanie kodu jak się analizuje jest jakby od wejścia w dół/głąb porównując do programowania proceduralnego/liniowego... przy OOP możesz nawet odwrócić sterowanie, daje to wiele możliwości, ale podstawowy problem leży w tym, iż wielu myli OOP z programowaniem obiektowym, gdzie to nie do końca to samo...

jeśli masz kilka warstw widoku to musisz kilka razy zbuforować wyjście... przykład pseudokodu
// TRESC
ob_start();
$tresc = ob_get_contents();
ob_end_clean();

// SZABLON
ob_start();
...
echo $tresc;
...
$strona = ob_get_contents();
ob_end_clean();

niby wydaje się to drugie buforowanie nie potrzebne, jednak jeśli np. widoki masz proste gdzie nie popełnisz błędów a dodatkowo chcesz przechwycić wyświetlane błędy by je ładnie wyświetlić czy coś w ten deseń np. jak w ZF to będzie Ci potrzebne jeszcze jedno buforowanie... oczywiście jeślii nie zamierzasz wyświetlać danego widoku czy go generować to go nie wyświetlasz...

marcinek37
ok, teraz rozumiem
czyli wychodzi na to, że wykonałem to poprwnie w moim szkielecie - sądziłem, że może istnieje jakieś lepsze rozwiązanie

ostatnio widziałem coś takiego, że ładowany był tylko content, ale on z kolei miał na początku i na końcu indludowane pliki typu "top.php" i "footer.php"
ale wydaje mi się, że to gorsze rozwiązanie

i tak przy okazji, czym się różni programowanie obiektowe od OOP?
skoro OOP to skróc od object-oriented programming, co w tłumaczeniu brzmi właśnie programowanie obiektowe
zegarek84
Cytat(marcinek37 @ 23.01.2014, 15:38:46 ) *
...
i tak przy okazji, czym się różni programowanie obiektowe od OOP?
skoro OOP to skróc od object-oriented programming, co w tłumaczeniu brzmi właśnie programowanie obiektowe

OOP (ang. object-oriented programming) (dosłowne tłum. to "programowanie zorientowane obiektowo") jest rozwinięciem poprzednich technik (prog. liniowe, proceduralne, i właśnie obiektowe). OOP to jest bardziej filozofia budowania aplikacji, niż metoda programowania. Jako tłumaczenie OOP można by też napisać, że jest to "myślenie zorientowane obiektowo". OOP zawsze też jest programowaniem obiektowym, ale programowanie obietowe nie koniecznie musi być programowaniem zorientowanym obiektowo... korzystając np. z PDO możesz rozszerzyć klasę i ją dostosować do własnych potrzeb programując obiektowo, ale obiekty te mogą być jakby luźne w aplikacji i większość tej aplikacji może być napisana z wykorzystaniem kodu poprzez rozszerzenie klas, tworzenie potrzebnych instancji obiektu ale aplikacja może być napisana jakby w stylu proceduralnym z wykorzystaniem tych obiektów...

w OOP najczęściej na wejściu masz jeden obiekt/klasę startujący, gdzie przekazujesz sterowanie aplikacji i zagłębiasz się w głąb hierarchi elementów kompozycji (dynamiczne dodatkowe obiekty najczęściej będące składowymi obiektu) lub sterując dynamicznie aplikacją tworzysz w metodach odpowiednie obiekty gdzie znowu możesz się zagłębiać, taka struktura drzewiasta jakby inne if'y dla mnie... zależy jak aplikacja jest zaprojektowana ale w ten sposób często można też odwrócić sterowanie jeśli coś po drodze jakiś obiekt niżej w hierarchii zadecyduje (typowe kontrolery np.), przy aplikacjach pisanych w C++ czy JAVA wiele obiektów sterujących najczęściej będzie utworzona raz i zapisana w zmiennych obiektu nadrzędnego (kompozycja) gdyż aplikacje tego typu najczęściej działają inaczej niż typowe aplikacje PHP, na ogół po prostu stale (wyjątkiem będzie napewno większość aplikacji konsolowych)... JAVA niby wymusza paradygmat OOP przez utworzenie na start obiektu z metodą main(...), co nie znaczy, że dalej wszyscy będą pisali aplikację w stylu OOP...

sorki, że się rozpisałem i nie wiem, czy mnie zrozumiałeś ;p
Greg0
Może jakiś micro-framework? Silex lub Slim? Co prawda nie ma tam MVC ale przykład zbudowania aplikacji oop jak najbardziej.
marcinek37
zgłupiałem po przeczytaniu postu zegarka84...

zrozumiałem tylko tyle, że OOP to bardziej złożona aplikacja
generalnie nie można napisać frameworka opartego na schemacie MVC bez OOP - dobrze rozumiem?

problem w tym, że jestem samoukiem i niektórych informatycznych pojęć nigdy nie zrozumiem :/
com
OOP to nie jest wcale złożona aplikacja, to jest schemat według którego te aplikacje budujesz np
  1. class SimpleClass
  2. {
  3. // property declaration
  4. public $var = 'a default value';
  5.  
  6. // method declaration
  7. public function displayVar() {
  8. echo $this->var;
  9. }
  10. }


I tak jak mówisz jak sama nazwa wskazuje MVC model, widok, kontroler nie uzyskasz takiego podziału pisząc strukturalnie wink.gif
marcinek37
dla mnie powyższy kod to po prostu obiektowe PHP, to zwykła klasa, parametr i metoda - nic więcej
com
a OOP (Object-oriented programming) to co to niby innego?
marcinek37
dla mnie OOP to synonim obiektowego programowania
ale kilka postów powyżej zegarek84 napisał, że jest inaczej
com
Cytat
OOP to nie jest wcale złożona aplikacja, to jest schemat według którego te aplikacje budujesz


No zgadza się dokładnie tak jak napisał zegarek84 ale to wcale nie oznacza, że w OOP obiektowość jest jakaś inna...

Generalnie chodzi o to że tak samo jak nie użyjesz armaty by strzelać do wróbla tak samo tutaj, można pisać obiektowo na wiele sposobów i OOP jest własnie jednym z nich wink.gif
marcinek37
ok, czyli już jedno się wyjaśniło - całe szczęście, bo już się bałem...

w takim razie możesz w nieco prostszych słowach napisać, czym się różni normalne programowanie obiektowe od OOP?
bo po przeczytaniu wszystkiego dochodzę do wniosku, że OOP służy temu, aby budować bardzo duże aplikacje, dzięki czemu można je w szybki sposób zmieniać

ale w sumie to cechy każdego programowania obiektowego...
Greg0
Do zbudowania budy dla psa i domu drewnianego użyjesz podobnych "technik" (w teorii). Zbudowanie domu będzie o wiele trudniejsze bo jest wiele bardziej skomplikowane. Tutaj jest to samo. Możesz napisać prostą aplikację obiektowo i możesz napisać bardzo skomplikowaną z ogromną ilością klas i zależności. Namieszliśmcie troche chłopakowi w głowie, ja zresztą nie lepszy smile.gif
marcinek37
rozumiem, że każdy biorący udział w dyskusji mógł mi nieco namieszać w głowie
ale czy znajdzie się ktoś, kto w prosty, logiczny sposób wyjaśni mi, czym się różni zwykłe progrwamowanie obiektowe od OOP?

najlpiej, jeśli zrobi to na prostych klasach, albo używając prostych sformułowań - na pewno się da wink.gif
viking
Załóżmy że masz jakąś tabelkę w bazie użytkownicy. id, hasło, email itp. Klasa może stanowić jej wierne odwzorowanie.

  1. class User {
  2. protected $id;
  3. protected $email;
  4.  
  5. public function getId() {
  6. return $this->id;
  7. }
  8.  
  9. public function setId($id) {
  10. $this->id = (int) $id;
  11. return $this;
  12. }
  13.  
  14. //itd dla kolejnych pól
  15. }


Mając teraz dane z różnych źródeł np formularza ze strony, możesz wypełnić obiekt danymi i przekazać go dalej do innej klasy zapisującej czy nawet w zależności od stosowanego rozwiązania bezpośrednio zapisać przez coś w stylu (new User())->save(); Sprawia to że twoje dane są uporządkowane, grupują podobne funkcjonalności. W tym wypadku obiekt może mieć też przypiętą metodę sprawdzającą poprawność wprowadzonych danych itd. Możesz go też bardzo łatwo przekonwertować np na tablicę (po polach protected). W zależności od potrzeb możesz ten obiekt rozszerzyć o dodatkowe funkcjonalności (extends) które nie będą wpływać na klasę bazową. Łatwiej również porządkować funkcjonalności np popularne warianty MVC gdzie zazwyczaj klasa jest kontrolerem a metoda akcją. Wiesz gdzie szukać, akcje o podobnej funckjonalności wewnątrz konkretnego kontrolera, a zbiór kontrolerów zebrany w moduł. Po prostu trzeba spróbować bo podobnych dyskusji było juz bardzo wiele.
zegarek84
Cytat(marcinek37 @ 26.01.2014, 06:05:41 ) *
...
ale czy znajdzie się ktoś, kto w prosty, logiczny sposób wyjaśni mi, czym się różni zwykłe progrwamowanie obiektowe od OOP?

OOP można by rzec, że to programowanie obiektowe na sterydach, aplikację starasz się pisać jakby modułowo, tworzysz zależności między obiektami, nawet tymi które mogą być luźno powiązane, w samych metodach niby można pisać strukturalnie ale nieraz obiekt po prostu ma za zadanie sterować czymś, więc starasz się myśleć trochę szerzej obiektowo, dlatego napisałem, iż spolszczone tłumaczenie to raczej "myślenie zorientowane obiektowo", a dosłowne "obiektowo zorientowane programowanie"

tak na prawdę większość osób mówiąc po prostu o programowaniu obiektowym będzie miało także na myśli programowanie zorientowane obiektowo... po prostu to szczegół i programuj po swojemu, nabierając praktyki każdy sobie wyrabia własny styl.

Z tymi nazwami to nieraz jest tak jak np. ze sportami/sztukami walki, teraz bardzo popularne jest np. bjj (brazylijskie ju-jtsu), większość trenujących coś w ten deseń mówi, iż trenują ju-jutsu, a ja na spraringach dopytuję się z ciekawości czy tradycyjne czy brazylijskie (a to jest różnica ];->), gdy chciałem poćwiczyć parter tylko bez wykorzystania kimon poszedłem na odpowiednie treningi, trener zapytał się mnie co ćwiczyłem i stwierdził, że jako sport może uznać boks tajski, ale aikido to tak na prawdę jakby tego nie było, trochu mi nie pasowały docinki ze strony trenera, nic nie mówiłem i ćwiczyłem to co chciałem poćwiczyć, aż w końcu doczekałem się na sparingi w stójce w stylu zapasów/judo, nie bardzo do mnie przemawiały ich techniki i wykonywałem swoje wyuczone z klinczu boksu tajskiego i z aikido, ich miny nie zapomniane jak se pofruwali i nie wiedzieli co się dzieje ];->, fakt na aikido niby nie ma sparingów ale z judokami sparowałem się w przeszłości...

odszedłem od tematu ale po to, by wyjaśnić, iż często prawda leży po środku i każdy jest inny, inaczej sobie tłumaczy wiele rzeczy, po prostu rób swoje i dąż do celu ;]

pozdrawiam
marcinek37
ok, teraz już rozumiem - serdeczne dzięki!

próbuję pisać swoją własną aplikację, oczywiście zaczynam od totalnie podstawowego modułu podstron
wydaje mi się, że schemat katalogów i kod uprawnia mnie do stwierdzenia, że piszę w OOP
chętnie podam linka do paczki, jeśli komuś się chce to zweryfikować smile.gif
destroyerr
Cytat
ok, teraz już rozumiem

Szczerze to chciałbym Ci pogratulować, że z tego bełkotu udało Ci się cokolwiek zrozumieć. Jakiś bzdurny rozdział między programowaniem obiektowym a OOP wynikającym z dosłownego tłumaczenia. Programowanie obiektowe i OOP oznacza dokładnie to samo.


Cytat
wydaje mi się, że schemat katalogów

Schemat katalogów nie ma żadnego związku z tym czy kod jest obiektowy. Możesz sobie cały kod umieścić w jednym pliku a i tak może być to programowanie obiektowe.
lukasz1985
@marcinek37
Ja mam ciągle wrażenie, że Ty czegoś nie rozumiesz. A właściwie, że wciąż nie rozumiesz po co Ci programowanie obiektowe.
marcinek37
rozumiem, dlaczego warto z niego korzystać, bardzo dużo mi pomogłeś, za co jestem bardzo wdzięczny
powolutku układam sobie wszystko w głowie, robiąc w osobnym pliku listę pytań
com
pomijają fakt że lukasz1985 to tu akurat nie miał swojego wkładu, generalnie po prostu zacznij programować obiektowo.. a OOP przyjdzie wraz z doświadczeniem wink.gif
marcinek37
owszem, ale lukasz1985 pomógł mi w innym wątku

nie chcę tworzyć nowego tematu, aby zadać Wam proste pytanie, więc mam nadzieję, że nie otrzymam ostrzeżenia od moderatorów
  1. <?
  2. class nazwaklasy{
  3. public $zmienna;
  4.  
  5. function __set($nazwa, $wartosc) {
  6. $this->$nazwa = 'prefix.'.$wartosc;
  7. }
  8.  
  9. }
  10.  
  11. $a = new nazwaklasy();
  12. $a->zmienna = 'wartosc';
  13. $a->zmienna2 = 'wartosc2';
  14. echo $a->zmienna.'<br />'.$a->zmienna2;
  15. ?>


dlaczego ciąg "prefix." został dodany tylko w zmiennej $zmienna2?
czy tylko dlatego, że na początku klasy dodałem public $zmienna?

pytam, bo piszę klasę, do której wchodzi zmienna ID (np. $a->id = 2) i pomyślałem, żeby wykorzystać funkcję __set do sprawdzenia poprawności tejże zmiennej (bo w pasku adresu ktoś dla testu może skasować liczbę i wpisać obojętnie co innego)
Greg0
Nie działa bo pole "zmienna" istnieje już w klasie i twoje przypisanie wartości nie przechodzi przez metodę __set()
marcinek37
rozumiem, a zatem zastosowanie metody prepare() rozwiąże problem
  1. <?
  2. class nazwaklasy{
  3. public $id;
  4.  
  5. function prepare(){
  6. $this->id = (int)$this->id;
  7. }
  8.  
  9. function show(){
  10. return $this->id;
  11. }
  12.  
  13. }
  14.  
  15.  
  16. $a = new nazwaklasy();
  17. $a->id = $_GET['id'];
  18. $a->prepare();
  19. echo $a->show();
  20. ?>


wiadomo, że każdy pisze kod inaczej, ale czy wg Ciebie takie sprawdzanie numeru ID jest akceptowalne? wiadomo, że INT pozostawi tylko liczby, w metodzie prepare() w przyszłości dodałbym sprawdzanie, czy rekord o podanym ID istnieje w bazie danych - oczywiście za pomocą PDO, bo czytałem, że to najlepsza klasa do łączenia aplikacji z bazą danych
zegarek84
Cytat(marcinek37 @ 27.01.2014, 13:30:49 ) *
wiadomo, że każdy pisze kod inaczej, ale czy wg Ciebie takie sprawdzanie numeru ID jest akceptowalne? wiadomo, że INT pozostawi tylko liczby, w metodzie prepare()...

raczej nazwy metod coś powinny mówić... wielu stara się robić zmienne chronione bądź prywatne by nie były dostępne z zewnątrz i w celu ich prawidłowego ustawienia tworzy settery i gettery (bardziej by to pod JavaScript pasowało), ale bardziej jawne, czyli z nazwy (wszyscy mówią, by kłaść nacisk na angielski, po polsku ustawId...) "setId($iId)" lub "set_id($id)", w pierwszym przypadku np. przez pierwszą literę podałem typ prosty zmiennej, zwyczajowo nazwy pierwsze litery słowa duża litera lub poprzedzone przez "_", czyli "setId($id)" i "getId($id)"

gdyby zmienna zdefiniowana przez Ciebie była chroniona lub prywatna zadziałała by metoda magiczna __set($name, $value), podobnie z __get($name) - ale wtedy zazwyczaj zmienne są jakby w innej przestrzeni nazw (nie traktuj tego dosłownie), po prostu by nie wejść w konflikt ze zmiennymi składowymi klasy zazwyczaj te zmienne są definiowane w tablicy będącą zmienną chroniona/prywatną danej klasy (później obiektu - klasa to stempel obiektu)...

rzutować typy proste też można na kilka sposobów, ostatnio to co muszę napisać jakoś częściej piszę w C++ a i też wolę JavaScript nad PHP więc sprawdziłem w konsoli i np. rzutowanie do całkowitej przez podwójną tyldę nie działa, z kolei ten język też jest na tyle dynamiczny, że rzutowanie przez bity działa podobnie jak w JS, oczywiście ten akapit raczej jako ciekawostka gdyż będziesz używał (int) itd...

  1. <?php
  2. class Test{
  3. protected $test;
  4. public function __set($sName, $value){
  5. $this->$sName = "pref_".$value;
  6. }
  7. public function getTest(){
  8. return $this->test;
  9. }
  10. }
  11.  
  12. $oTest = new Test;
  13. $oTest->test = "co";
  14. $f = "3.2abc";
  15. $g = 0 | $f;
  16. echo $g
  17. ,"\n", ~~$f // takie rzutowanie działa w JavaScript
  18. ,"\n", $oTest->getTest();


ps. ale coś wspomniałem o konwencji nazw... to też będzie Ci się zmieniało z czasem lub w zależności z kim będziesz współpracował, np. przyjęte jest, iż w PHP oraz JS zmienne prywatne/chronione mają prefiks "_", mi np. ostatnio bardziej pasuje sufix "_" częściej stosowany w C++, po za tym dłuższe zmienne staraj się nazywać w takiej kolejności by było Ci wygodniej, jako pierwsze słowo to co zazwyczaj pierwsze by Ci przychodziło do głowy jesli chodzi o podpowiadanie nazwy, dla mnie to jest rzeczownik a potem przymiotnik, ale różnie to jest ;]
marcinek37
1. Twój post nie odpowiedział mi do końca na pytanie z postu #38 - w jaki sposób sprawdzić poprawność atrybutu id

2. ale przy okazji możesz mi wyjaśnić ten kod:
  1. <?
  2. $f = "3.2abc";
  3. $g = 0 | $f;
  4. ?>


pierwszy raz widzę taki zapis i nie rozumiem, dlaczego pokazuje się wartość "3"
generalnie masz może jakiś artykuł, w którym są przedstawione skrótowe kody w php?

3. i przy okazji; czy wg Ciebie naprawdę warto dodawać prefixy w nazwie zmiennych?
$aTablica
$sString
$oObiekt
$iLiczba

też tak robicie? czy to już raczej pedantyczna skrajność?
zegarek84
pkt. 1 można rozwiązać na wiele sposobów, włącznie z rzucaniem błędów ;]
Cytat(marcinek37 @ 27.01.2014, 16:26:25 ) *
2. ale przy okazji możesz mi wyjaśnić ten kod:
  1. <?
  2. $f = "3.2abc";
  3. $g = 0 | $f;
  4. ?>


pierwszy raz widzę taki zapis i nie rozumiem, dlaczego pokazuje się wartość "3"
generalnie masz może jakiś artykuł, w którym są przedstawione skrótowe kody w php?

czasami string w PHP jest nie jawnie konwertowany na integer/floata... i dalej myśl o tym jak o operacjach bitowych, 0 jest typu integer, bitowe lub spowoduje utratę precyzji liczby float do typu integer po lewej, w sumie jeśli ustawione były by same jedynki to można by zastosować &...
Bitwise Operators
Cytat(marcinek37 @ 27.01.2014, 16:26:25 ) *
3. i przy okazji; czy wg Ciebie naprawdę warto dodawać prefixy w nazwie zmiennych?
$aTablica
$sString
$oObiekt
$iLiczba

też tak robicie? czy to już raczej pedantyczna skrajność?

dawniej tak robiłem, ostatnio coraz częściej piszę w C++ i jakoś coraz rzadziej stosuję tą zasada, gdyż traktując każdy typ zmiennej jako obiekt w podpowiedzi składni raczej szukam to, co mi przychodzi na myśl i od tego zaczynam pisać pracując z większym kodem, jedynie czasami typy proste poprzedzam prefiksami, gdzie "a" czasami daję ogólnie do kontenerów tablicowych z przyzwyczajenia... z kolei przy zmiennych prywatnych wolę je oznaczać sufixem "_" a nie prefixem

ogólnie w PHP raczej wszyscy zalecają PSR-...
PHP i standardy PSR

marcinek37
świetne materiały!
dziękuję wink.gif

nie chcę otwierać nowego tematu z powodu takiej drobnej sprawy, dlatego piszę tutaj
potrzebuję wykorzystać tablicę spoza klasy do drobnej rzeczy, wykorzystałem taki kod:
  1. <?
  2. $array = array('test', 'test2');
  3.  
  4. class Klasa{
  5. public $value;
  6.  
  7. public function metoda(){
  8. global $array;
  9. return in_array($this->value, $array) ? 'ok' : 'error';
  10. }
  11.  
  12. }
  13.  
  14. $a = new Klasa();
  15. $a->value = 'test2';
  16. echo $a->metoda();
  17. ?>


niby sprawa prosta, ale doczytałem, że global w klasie nie jest zgodny z ideą OOP - a zatem jak wprowadzić wartości tabeli $array do klasy?
oczywiście można tak samo jak $a->value, ale co będzie, gdybym chciał wprowadzić 15 zmiennych spoza klasy do klasy?
sazian
  1. $array = array('test', 'test2');
  2.  
  3. class Klasa{
  4. public $value;
  5. protected $array=array();
  6.  
  7. public function setArray($array)
  8. {
  9. $this->array=$array;
  10. }
  11.  
  12. public function metoda(){
  13.  
  14. return in_array($this->value, $this->array) ? 'ok' : 'error';
  15. }
  16.  
  17. }
  18.  
  19. $a = new Klasa();
  20. $a->value = 'test2';
  21. $a->setArray($array);
  22. echo $a->metoda();
marcinek37
czyli generalnie nie powinno używać się globali, a wszystkie dane z zewnątrz klasy powinno wprowadzać się na zasadzie:
$obiekt->atrybut = $zmiennaSpozaKlasy;

przyznam, że to dosyć kłopotliwe, bo jak będę musiał skorzystać z 10 zmiennych spoza klasy, będę je musiał 10 razy wprowadzać, zamiast w jednym ciągu wpisać je w global
ale jak rozumiem to standard, do którego po prostu trzeba się dostosować
Pyton_000
Obiekt klasy powinien mieć określoną, skończoną ilość atrybutów które może przyjmować. Może mniej ale nie więcej.
Możesz rozwiązać np. tworząc sobie tablicę parametrów np:
  1. <?php
  2. class A {
  3. protected $vars = array();
  4.  
  5. public function addVar($name, $var) {
  6. $vars[$name] = $var;
  7. }
  8.  
  9. public function getVar($name) {
  10. return $vars[$name];
  11. }
  12. }


To taki prosty przykład.
mrc
Zawsze można tak:

  1. // Tworzenie klasy
  2. class A
  3. {
  4. protected $_data = array();
  5.  
  6. public function setData(array $data)
  7. {
  8. $this->_data = $data;
  9. }
  10.  
  11. public function doSomethingWithData()
  12. {
  13. // przykład
  14. if($this->_data['a'] == '10) throw new \Exception("A");
  15. }
  16. }
  17.  
  18. // Użycie klasy
  19. $array = array('a' => 10, 'bb');
  20. $a = new A();
  21. $a->setData($array);
  22. $a->doSomethingWithData();


I takim oto sposobem nie musisz przekazywać 10 parametrów, tylko przekazujesz ich tablicę.
Dejmien_85
Cytat(marcinek37 @ 8.02.2014, 23:56:43 ) *
czyli generalnie nie powinno używać się globali


Marcinie, programowanie obiektowe to bardzo głęboka nora, w której wielu błądzi - ale tylko z tego powodu, że zabierają do niej stare nawyki.

Tutaj musisz zapomnieć o wszystkim co robiłeś wcześniej. Co mogę Ci polecić to... unikać stwierdzeń typu: "W OOP nie powinno się używać zmiennych globalnych". Zapamiętywanie prostych zasad (ograniczeń) niczego Cię nie nauczy. Tutaj jest jak z tańcem - musisz poczuć rytm, inaczej nie zatańczysz.

Jeśli chcesz zrozumieć na czym polega programowanie obiektowe, wtedy musisz koniecznie zrozumieć zasady programowania obiektowego - tutaj chodzi o IDEĘ. Polecam Ci zainteresowanie się tematem Object Oriented Design (a także Object Oriented Analysis), TO jest złoty klucz do zrozumienia programowania obiektowego.

Gdy zrozumiesz ideę, wtedy zaczniesz myśleć innymi kryteriami... i wtedy zacznie się taniec! guitar.gif

Samo to, że ciągle myślisz kategoriami zmiennych oraz tablic oznacza, że na swoich plecach nosisz ciągle ciężki bagaż programowania strukturalnego/proceduralnego - a to Cię tylko ogranicza. Bierz więc czym prędzej książkę jakąś o OOD i niechaj Twój umysł ujrzy światłość. graduated.gif

PS. Patrz niżej...

Cytat(marcinek37 @ 8.02.2014, 23:56:43 ) *
$obiekt->atrybut = $zmiennaSpozaKlasy;


Prawdę mówiąc tak też się nie powinno robić. wink.gif
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.