Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przykład obiektowo napisanej strony...
Forum PHP.pl > Forum > PHP > Object-oriented programming
l05i3k
Witam,
dopiero zaczynam przygodę z obiektowym php'em, a do tej pory tworzyłem stronki proceduralnie.

Przeczytałem kilka kursów, przejrzałem kilkadziesiąt stron książki do programowania obiektowego w php (http://helion.pl/ksiazki/php5zp.htm), ale w zasadzie oprócz poznania w miare dobrze pojęć mi nic to więcej nie dało.

Postanowiłem więc porpostu mniej więcej przygotowac sobie zarys aplikacji, którę chcę stworzyć i się za nią zabrać próboując zrobić to obiektowo. Jednak zatrzymałem się już na samym początku. Nie do końca wiem, jak zacząć clase. Dlatego chciałbym prosić o jakiś adres strony, na której znajduje się w miare prosty sposób wykonana jakaś strona obiektowo. Oczywiście mógłbym wziąć takie postnuke i analizować linijka po linijce, ale wątpie, abym tak szybko sie w tym połapał. Potrzebuję czegoś bardziej ludzkiego i prostrzego. Może ktoś ma gdzieś jakąś swoją starą stronę wykonaną obiektowo i zechciałby udostępnić jej kod źródłowy? (prosiłbym tylko, o to, aby w miare możliwości wykonana ona była w php5)

Lub, jeśli ktoś ma czas, aby podpowiedział jak rozwiącać taki przykładowy problem:
Załóżmy, że mamy jedną ogromną klasę "Tresci", a w niej chcecie umieścić podklasy Artykuły, Newsy, Recenzje itp. I teraz jak się do tego zabrać? Czy już w klasie "Tresci" do konstruktora wywalić polecenie pobrania z bazy pierwszego artykułu, badź news'a? Czy może robić to osobno w każdej podklasie? Jak wykonać konstruktor pobierający odrazu elementy z bazy danych? Łączyć się z bazą standardowo? Czy wykorzystać obiektowa bibliotekę mysqli? Czy tworzyc uchwyt w konstruktorze klasy Treści, czy zapisać metody obsługi bazy w innej klasie i włąnczyć go do bazy Tresci?

Bybym wdzięczny za wszelkie rady, lub delikatne sugestie.
Bardzo jednak bym prosił, o to, aby ktoś w miare możliwości udostępnił mi jakiś swój stary projekt strony zrobiony obiektowo w php5...

Z góry dziękuję.
domis86
poczytaj se o MVC smile.gif
MVC to przyklad sposobu na "obiektowe napisanie strony"

pozniej przeczytaj sobie 2 rozdzial manuala symfony:
http://www.symfony-project.com/book/1_0/02...-Symfony-s-Code

jest tu opisane w praktyce jak sie stosuje mvc (jak symfony stosuje mvc)
l05i3k
Ok, dzięki, napewno poczytam...
Tylko to wygląda na trochę wyższy poziom niż zwykły obiektowy php...
A ja jednak wolałbym stopniowo iść do przodu...
grudziu
nikt nic nie da, żadnego przykładu?
mi tez by się przydało...
wlamywacz
Zainwestuje w książkę: Helion - PHP Vademecum Profesjonalisty

Polecam
marcio
mam ta ksiazke powiem szczerze dobrze tlumaczy ale ja jestem za glupi zeby zrozumiec OOP
dr_bonzo
marcio: No to z czym masz problem? Po prostu odpusc sobie.....

Zanim ja pojalem obiekty i cala reszte to minelo 4-5lat, tak ze jestes w lepszej sytuacji, masz internet, dostep do dobrych ksiazek itp, to po prostu trwa troche.
carbolymer
Cytat
Zanim ja pojalem obiekty i cala reszte to minelo 4-5lat, tak ze jestes w lepszej sytuacji, masz internet, dostep do dobrych ksiazek itp, to po prostu trwa troche.

Heh, programowanie proceduralne to tak jakbym sie cofnął o 3 miesiące w czasie, teraz jak zaglądam do tamtejszego kodu to dziwię się jaki byłem niechluj i zastanawiam sie czemu nie korzystałem z php 5 biggrin.gif

Cytat( @ 3.11.2007, 15:50:00 ) *
poczytaj se o MVC smile.gif
MVC to przyklad sposobu na "obiektowe napisanie strony"

pozniej przeczytaj sobie 2 rozdzial manuala symfony:
http://www.symfony-project.com/book/1_0/02...-Symfony-s-Code

jest tu opisane w praktyce jak sie stosuje mvc (jak symfony stosuje mvc)

MVC jak na początek przygody z programowaniem obiektowym to chyba trochę za wiele cool.gif

Spróbuj zrobić tak żeby było wygodnie i z zachowaniem umiaru. Pamiętaj o zasadzie kapsułkowania (rozdzielania zadań do mniejszych podjednostek) i strzeż się od przedawkowania tejże zasady.

Ja bym zrobił to tak:
class DBDriver{}
Tutaj dajesz obsługę mysql - czyli przechwytywanie błędów, zabezpieczanie przed SQLInjection, wykonywanie kwerend, łączenie i rozłączanie.
class Contents {}
Ta klasa przechowuje referencję do DBDriver, obsługuje operacje wspólne dla klas dziedziczonych (czyli np. głosowanie, komentowanie)
class Article extends Contents {}
Ta klasa ma te metody, które nie mogą być użyte w klasie News
class News extends Contents() {}
Ta klasa ma te metody, które nie mogą być użyte w klasie Article

Spróbuj napisać swój kod jak najbardziej abstrachując (chyba tak sie to pisze tongue.gif) - tworząc interfejsy, po których nie można poznać że używasz bazy danych.

Tak naprawdę proponowałbym ci nie dzielić dane na klasy, ale części aplikacji np. połączenie z bazą, operacje na newsach, wyświetlanie, śledzenie błędów.
Spróbuj może opisać jaśniej swój problem.
Helios
Cytat(carbolymer @ 10.11.2007, 20:43:06 ) *
Tak naprawdę proponowałbym ci nie dzielić dane na klasy, ale części aplikacji np. połączenie z bazą, operacje na newsach, wyświetlanie, śledzenie błędów.
Spróbuj może opisać jaśniej swój problem.

Dlaczego nie dzielic danych na klasy? W Javie, ktora jest typowo obiektowym jezykiem nawet takie typy danych jak liczba (Integer), ciag znakow (String, StringBuffer) to obiekty. Przeciez, gdyby programowie obiektowe polegalo na samej agregacji dzialan do odrebnych klas to by nic z tego nie bylo - kod proceduralny ubrany w klasy. Jezeli obiekty konkretyzuja obiekty na wskutek wywolan swoich metod i przekazuja innym obiektom te rezultaty to chyba wlasnie dopiero ma sens.
basso
Witam,
Mam identyczny problem jak kolega który założył ten temat. Wcześniej stworzyłem sporo systemików w Javie, C++ etc. Umiem programować obiektowo. Jednak nigdzie nie ma przykładów, jak powinna wyglądać struktura obiektowej strony. W jaki sposób umieszczać pliki, w jaki sposób przekazywać dane do głównego indexu etc.

Nie ma nawet najmniejszego przykładu w ksiażkach. Z tego co przeglądnąłem w empikach ebookach to wszędzie uczą od podstaw PHP5. Jeśli ktoś tworzy takie strony, bądź wie jak powinno to wyglądać dołączam się do słów "pomóżcie".

Ja widzę to w ten sposób:

Index.php => główny plik przez który wszystko będzie przechodziło.

Index.php
Kod
<?php include("silnik.php"); ?>
<html>
<body>

<?php
// obiekty tworzymy w silniku

echo  $menu->wyswietl(); //
echo  $newsy->srodek_strony_wyswietl();
echo  $newsy->dolna_czesc_strony_wyswietl();
echo  $logowanie ->logowanie();

</body>
</html>


Teraz trzeba w silniku.php załadować wszystkie klasy i przełączać odpowiednie pliki (czyli taki kontroler).
silknik.php

Kod
--------------------------------------- Sekcja  startowa ----------------------------
<?php    
include("all_class.php"); // załaduj najpierw klasy abyśmy mogli z nich korzystać

--------------------------------------- Sekcja bezpieczeństwa ----------------------------    

zabezpiecz=new bezpieczenstwo(); // jakiś obiekt odpowiedzialny za bezpieczeństwo strony
echo zabezpiecz->skrypty() // tutaj można sprawdzać w metodzie czy przy pierwszym wejściu skrypty były okej
                        ->poziom_dostepu(); // ustaw poziom dostępu kogoś kto jest na stronie
                        ->sprawdz_pliki_po_zalogowaniu() //  sprawdź kompatybilność plików

--------------------------------------- Sekcja zmiany treści ----------------------------                                  
// teraz jest problem bo trzeba się bawić jakby w procedularne wywołania.
//Np. Kliknęliśmy w link index.php?akcja=relacje

newsy= new newsy(); // Tworze obiekt newsów
$newsy-> $_GET['akcja'](); // nazwa funkcji taka jak nazwa akcji czyli u nas "relacje"

--------------------------------------- Sekcja końcowa ----------------------------      
//Zamykanie bazy etc.
$baza->close();

?>

Przedstawię klasę newsy
Kod
class newsy
{
    private $tekst_newsow;


   public function srodek_strony_wyswietl() // Wypisz nasz srodek strony
   {
        return $this->$tekst_newsow;
   }


   public function relacje () // czyli nasza którą wywołujemy
   {
         // $baza = new baza; $baza->polacz(newsy);   -> połącz z bazą z newsami , jakieś tam newsy
            
         $this->tekst_newsow= $baza->zwroc(newsy);
            
   }

   // Jeśli zła nazwa metody
   public function __call ($nazwa,$parametr)
   {                
         $this->tekst_newsow="Przepraszamy ale takiej strony nie ma";
         $this->srodek_strony_wyswietl(); //
   }

}



Czyli teraz po kolei jak zostanie odczytywany kod.
Najpierw ładowany jest index.php w którym najpierw ładowany jest silnik.php:

I w silniku:
----> ładowani klas all_class.php -> no bo najpierw musimy załadować klasy żeby potem stworzyć z nich obiekty
----> potem przykładowe metody bezpieczeństwa
----> zmiana treści w naszym przypadku wywołana jest metoda relacje która pobiera nam "newsy relacje"
----> zamykanie połącznień sekcja końcowa
-> koniec silnika.php

Po zakończeniu skryptu silnika jesteśmy w tym miejscu w pliku index.php

Kod
<?php include("silnik.php"); ?>    <--- ZAKOŃCZYŁ SIĘ SILNIK I PRZECHODZIMY DALEJ
<html>
<body>
...
[code]

Następnie idą zgodnie z kodem , następuje sekcja <html><body>.
W body mamy następnie:

[code]
<?php
echo  $menu->wyswietl();
echo  $newsy->srodek_strony_wyswietl();
echo  $newsy->dolna_czesc_strony_wyswietl();
echo  $logowanie ->logowanie();
</body>


Czyli wyświetlamy jakieś tam nasze menu które ja nie robiłem.

Potem finalna nasza praca. Wyświetlanie środka strony.
W naszym przypadku to będą nasze newsy smile.gif. Czyli metoda $newsy->srodek_strony();

Potem dolna cześć której nie robiłem i jakieś tam logowanie smile.gif


Ja to tak wymyśliłem, nie wiem czy to jest zgodne z czymkolwiek, ale nigdzie nie ma książek i nie wiem czy w ten sposób możemy postępować. Proszę o pomoc.
Mephistofeles
http://symfony-reloaded.org/
Chyba jeden z najlepszych frameworków dostępych dla PHP, sprawdź kod.
basso
A jest ktoś w stanie wcześniejszy przykład przedyskutować. Czy tak to może być etc. ?
marcio
Cytat(basso @ 21.12.2010, 11:51:12 ) *
A jest ktoś w stanie wcześniejszy przykład przedyskutować. Czy tak to może być etc. ?

Tak jest do bani, to jedna wielka kiszka, z mvc/mvp ma to malo wspolnego.
Gdzie jest jakis dispather i router?
Gdzie masz bootstrap?
GDzie masz podzielona aplikacje na elementy m/v/c...?
itp....itd...
basso
To proszę pokazać jak to można zrobić dobrze.
Mephistofeles
Zajrzyj w link, który Ci dałem, przeanalizuj kod, przykłady. Kod samego frameworka pewnie Cię przerośnie, ale nic nie stoi na przeszkodzie, żebyś go (czy innych) używał.
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.