Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V  < 1 2  
Reply to this topicStart new topic
> Kurs OO [Nalfein]
Piotr_M
post 24.09.2004, 14:18:55
Post #21





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 18.09.2004

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


Mnie męczy jeszcze jedna sprawa. Jak najlepiej przekazywać obiekty?
Mam np. obiekt bazy danych, smarty i jeszcze kilka że tak powiem klas głównych
  1. <?php
  2. $db = new db();
  3. $smarty = new Smarty();
  4. ...
  5.  
  6. ?>

I teraz mam kolejną klasę, która ma używać dokładnie tych obiektów (nie kopii). I właśnie, jaki jest najlepszy sposób, aby przekazywać te obiekty? Mi się nasuwają 2 różne, ale oba wymagają przypisania $this->db = $db; i odwoływania się do za pośrednictwem $this->...
  1. <?php
  2.  
  3. class foo{
  4.     function foo(){
  5.         global $db;
  6.         $this->db=$db;
  7.         $this->db->fetch();
  8.     }
  9. }
  10. // i drugie
  11. class foo{
  12.     function foo($db){
  13.         $this->db=$db;
  14.         $this->db->fetch();
  15.     }
  16. }
  17.  
  18. ?>

Da się to jakoś elegancko rozwiązać?

Ten post edytował Piotr_M 25.09.2004, 21:30:40
Go to the top of the page
+Quote Post
Sh4dow
post 24.09.2004, 16:28:35
Post #22





Grupa: Zarejestrowani
Postów: 569
Pomógł: 0
Dołączył: 17.08.2003
Skąd: Dąbrowa Górnicza

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


mozesz zrobic klase ktora bedzie 'magazynem' obiektow, do ktorego bedziesz sie odwolywal, magazyn bedzie mial za zdanie sprawdzic czy instancja obiektu juz jest stworzona, jesli nie to twozy i oddaje referencje, a jesli juz jest to tylko oddaje referencje.
innym sposobem jest robienie, podczas tworzenia, metod statycznych ktore sa odpowiedzialne za tworzenie instancji. Metoda chyba wynkonanla jest tylko przy php w wersji 5


--------------------
Warsztat: Linux: PHP, MySQL, Apache, NetBeans, C++, Qt-Creator
Użytkownik, słowo którego specjaliści IT używają, gdy chcą powiedzieć idiota
Zarządzaj swoim budżetem domowym
Go to the top of the page
+Quote Post
Cudi
post 24.09.2004, 17:48:08
Post #23


Administrator planeta/IRC


Grupa: Przyjaciele php.pl
Postów: 385
Pomógł: 0
Dołączył: 19.04.2003
Skąd: Zabrze

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


Cytat(Sh4dow @ 2004-09-24 17:28:35)
innym sposobem jest robienie, podczas tworzenia, metod statycznych ktore sa odpowiedzialne za tworzenie instancji. Metoda chyba wynkonanla jest tylko przy php w wersji 5

Ta metoda to wzorzec projektowy singleton, i mozna go zaimplementowac takze w php 4 (choc dzieki wlasciwoscia statycznym w php 5 jej implementacja jest wygodniejsza i bezpieczniejsza). Przyklad implementacji w php 4:
  1. <?php
  2. class Templates {
  3. function &getInstance() {
  4. static $instance = null;
  5.  
  6. if ($instance == null) {
  7. $instance = new Templates;
  8. }
  9.  
  10. return $instance;
  11. }
  12. }
  13. ?>

Tak by to moglo wygladac w php 5:
  1. <?php
  2. class Templates {
  3. private static $instance = null;  
  4.  
  5. // prywatny konstruktor!
  6. private __construct() {
  7. }
  8.  
  9. public static function getInstance() {
  10. if (self::$instance == null) {
  11. self::$instance = new Templates;
  12. }
  13.  
  14. return self::$instance;
  15. }
  16. }
  17. ?>

Singleton pozwala nie tylko na posiadanie dostepnej wszedzie instancji obiektu, ale zabezpiecza także przed powstaniem więcej niż jednej instancji danego obiektu. W obu przypadkach przekazanie referencji do naszego obiektu wygląda tak:
  1. <?php 
  2. // w przypadku php 4 nalezy jeszcze dodac po znaku rownosci &, w celu zmuszenia php do przekazania referencji (a nie stworzenia kopii). php 5 robi to domyslnie dla obiektow.  
  3. $tpl = Templates::getInsance();
  4. ?>


--------------------
"Programmers are in a race with the Universe to create bigger and better idiot-proof programs, while the Universe is trying to create bigger and better idiots. So far the Universe is winning."
Cudi's devBlog
Go to the top of the page
+Quote Post
Piotr_M
post 25.09.2004, 23:05:23
Post #24





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 18.09.2004

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


Dzięki za odpowiedzi.
Kiedyś czytałem o wzorcach projektowych, ale przeczytać, a widzieć gdzie jakiego wzorca użyć to co innego... Chyba jednak użyję pierwszej metody ze względu na kompatybilność zrówno z php 4 jak i 5.
Sposób z magazynem obiektów nie do końca mi się podoba...
Cudi, jest mały błąd - brakuje function.
  1. <?php
  2.  
  3. // prywatny konstruktor!
  4. private function __construct() {
  5. }
  6.  
  7. ?>
Go to the top of the page
+Quote Post
msulik
post 9.10.2004, 20:35:35
Post #25





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 31.03.2002
Skąd: Toruń

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


Dopiero teraz przejrzałem ten kurs, dlatego jestem może trochę nie w temacie winksmiley.jpg Chciałem tylko powiedzieć, że rozdział I może przerazić początkujacego programistę.

Autor zaczął trochę z grubej rury, tak jakby od tyłu. Osobiście jestem zwolennikiem uczenia się czegokolwiek (w tym również OO) od podstaw i prostych przykładów z życia wziętych. Przykłady zamieszczone w tym kursie zawierają zbyt dużo rzeczy - zapytania sql, includowanie, pętle, smarty. To zaciemnia ideę OO, bo czytelnik może mieć dylemat, na czym ma się skupić. W dodatku częstą praktyką uczących się (znam to ze swojego i nie tylko swojego doświadczenia) jest przepisywanie przykładów toćka w toćkę, więc żeby te z kursu zadziałały, trzeba zrobić wiele rzeczy dookoła.

Czy nie lepiej byłoby podawać prostsze przykłady, chociażby banalny i oklepany, ale uniwersalny i piękny przykład klasy "Figura", jej pochodnych "Trójkąt", "Kwadrat", "Koło" z parametrami "pozycjaXY", "typFigury", metodami "podajTyp", "przesunDoGory" i metodami wirtualnymi np. "obliczPole", "narysuj" itp? W definicji oczywiście nie trzeba by podawać całego kodu na obliczenie pola czy procedury rysującej figurę, tylko opatrzyć ją odpowiednim komentarzem typu "tutaj idzie procedura rysująca".

Wiele podręczników do programowania pisanych nawet przez tzw. "doświadczonych dydaktyków" zawiera zbyt dużo informacji i dlatego mogą być nieczytelne dla ludzi dopiero zaznajamiających się z danym tematem.

Nie twierdzę, że podawanie zbyt złożonych przykładów uniemożliwia poznanie tematu, ale może zająć dużo więcej czasu worriedsmiley.gif A ponieważ OO jest w modzie, więc być może nawet początkujący programiści chcieliby się zaznajomić z tym tematem przy okazji uczenia się php. A przecież warto smile.gif


--------------------
misiu | chór

"Zdeterminowany programista potrafi stworzyć fatalny kod w każdym języku"
Allen Holub
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 28.03.2024 - 11:12