Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Dublowanie kodu w OPP
Forum PHP.pl > Forum > Przedszkole
eminiasty
Bardzo proszę o pomoc bo juz nie wiem w czym rzecz. Czym więcej dopisuje funkcji do mojej strony muszę kopiować wcześniej napisane linijki kodu. Przecież php obiektowe miało być proste. Mialo sie tu raczej nic nie powtarzać. Nie wiem co robię źle i jak można uprościć napisany przeze mnie kod. O co chodzi, tak na prawde?
Napisałem cały moduł newsów (bardzo uproszczony na razie), aczkolwiek są już funkcje takie jak index, view, add, edit, del (czyli podstawa). Problemem jest to, że muszę pomiędzy kontrolerami i wszystkimi/większością funkcji (tam gdzie wywołuje widoki) kopiować ciągle ten sam kod! W moim przypadku:

  1. if(isset($this->session->userdata['logged_in'])) {
  2. $session_data =$this->session->userdata('logged_in');
  3. $data['session_id'] = $session_data['id'];
  4. $data['session_login'] = $session_data['login'];
  5. $data['admin'] = $this->model_login->checkAdmin();
  6. }
  7. $data['setPageName'] = $this->model_site->setPageName();
  8. $data['returnSubpage'] = $this->model_panel->returnSubpage();
  9. @$data['breadcrumbs'] = $this->model_panel->breadcrumbs();


Odpowiada on za sesje, sprawdzenie czy jestes adminem, oraz inne funkcje z modeli.

PYTANIE DO WAS: Czy jest jakas możliwość by tego nie kopiwac a by nie rzucalo bledu o braku dostepi do zmiennej np $admin (juz w widoku)?
Próbowałem to wywoływać w konstruktorze jednak bez efektu ;/

Dorzucam całość jednego kontrolera:
http://wklejto.pl/288309

Dopiero się uczę obiektowości ...
markuz
Cytat
php obiektowe miało być proste

Ktoś Cię oszukał.

Cytat
Mialo sie tu raczej nic nie powtarzać

Jak napiszesz bez powtórzeń to się powtarzać nie będzie.

Czym według Ciebie jest __construct? Wiesz co to extends? (php obiektowe nie może być proste bez znajomości podstaw programowania obiektowego).
Poczytaj o tym, wtedy:

  1. if(isset($this->session->userdata['logged_in'])) {
  2. $session_data =$this->session->userdata('logged_in');
  3. $data['session_id'] = $session_data['id'];
  4. $data['session_login'] = $session_data['login'];
  5. $data['admin'] = $this->model_login->checkAdmin();
  6. }


zostanie tylko w 1 miejscu.

Mała podpowiedź:

Jeżeli w każdym kontolerze potrzebujesz danych o zalogowanym użytkowniku to te informacje mogą być pozyskiwane w nadrzędnej klasie np. MY_Controller - po której dziedziczyć będą wszystkie inne kontrolery Twojej aplikacji. Potem będzie jeszcze z problem przekazania tych danych do widoku, ale możesz utworzyć właściwość klasy MY_Controller o nazwie np. viewData do której będziesz przekazywał wszystkie zmienne które mają znaleźć się w widoku.
eminiasty
Cytat
php obiektowe miało być proste

chodziło o to, że łatwiejsze od strukturalnego


  1. __construct? Wiesz co to extends?


dzieki extends dziedziczymy klase nadrzędna w tym wypadku jest to CI_Controller, który jest klasa bazową frameworka i (ponoć) nie powinienem go ruszać
jeśli chodzi o konstruktor jest to specjalna metoda ktora ma taka sama nazwe jak klasa, jest nazywany w php obiekt "magiczna metoda" i wywolywany jako __construct(), np. można przekazywać przez nia różne elementy

Wiec, wracajac:
Cytat
Jeżeli w każdym kontolerze potrzebujesz danych o zalogowanym użytkowniku to te informacje mogą być pozyskiwane w nadrzędnej klasie np. MY_Controller

chyba nie moge edytować domyslnej klasy, a jednoczesnie klasa moze dziedziczyc tylko z jednej klsay na raz, co staje sie problemowe
Evinek
Cytat
chodziło o to, że łatwiejsze od strukturalnego

Nie, nie jest łatwiejsze. Można zrobić aplikacje, która będzie łatwiejsza w utrzymaniu, ale samo w sobie programowanie obiektowe jest trudniejsze.

Masz CI_Controller, potem MY_Controller, a potem już konkretny kontroler, który już robi swoje.

  1. <?php
  2.  
  3. class A {
  4. public $a = 1;
  5. }
  6.  
  7. class B extends A {
  8. public $b = 2;
  9. }
  10.  
  11. class C extends B {
  12. public $c = 3;
  13. }
  14.  
  15. $c = new C;
  16.  
  17. echo $c->a; // 1
  18. echo $c->b; // 2
  19. echo $c->c; // 3
markuz
__construct() ma taką cechę (jedną z kilku), że jego zawartość jest wykonywana za każdym razem gdy tworzysz instancje danej klasy. Czyli to jest dobre miejsce na kod który podałeś wyżej.

Nie możesz edytować CI_Controller, ale możesz stworzyć nową klasę MY_Controller która dziedziczy po CI_Controller, a następnie każdy inny kontroler np. News dziedziczy po MY_Controller.
Tomplus
Pamiętaj, że tworzenie klas nie musi, a często nie powinno zawierać wszystkich funkcji jakie ma mieć twój skrypt.
Np. funkcje autoryzacji powinny być w innym obiekcie. Wtedy powtórzeń nie będzie.

A co do samego OOP - nikt nie powiedział że człowiek od razu nauczy się programowania obiektowego po przeczytaniu jednej książki, artykułu czy kursu PHP-OOP. Człowiek uczy się poprzez praktykę. Dzisiaj robisz spieszysz kod ale jutro będziesz się śmiał z tego że byłeś taki głupi że nie potrafiłeś tak prostych rzeczy smile.gif

Nie poddawaj się!
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.