[PHP] Dziedziczenie w PHP5

0

Chciałem stworzyć stronę w PHP5 w pełnie (albo w dużym stopniu obiektową) ale mam problem z pewną rzeczą, a więc już tłumacze:

  • mam kilka klas (do przechowywania zmiennych konfiguracyjnych, do komunikacji z bazą mysql, do cookiesów, i jeszcze pare innych)
  • przy wyborze z menu określonej pozycji w zmiennej $_GET['task'] jest zawarta informacja który plik należy zaincludować, żeby otrzymać dostęp do pożądanych informacji
  • w pliku znajduje się klasa, która nazywa się tak samo jak plik i standardowo wywoływana jest metoda [nazwa_klasy]::Main();

I teraz moje pytanie, w związku z tym, że w PHP5 dziedziczyć można tylko po jednej klasie a chciałbym w tej nowej (includowanej) klasie mieć dostęp do metod komunikacji z baza danych (klasa mysql) i dostęp do zmiennych konfiguracyjnych (klasa config).

jak mogę rozwiązać takie coś ?

0

Np. interfejs i kompozycja.

0

a w CMSie Joomla jak to jest rozwiązane, bo tam nie doszukałem się nigdzie interfejsów, z tego co widziałem to jest tam chyba tylko dziedziczenie. Niestety jest tam strasznie dużo klas bym mógł to ogarnąć.

0

Nie wiem, nie uzywam. Mozna rozwiazac na kilka sposobow, ale ten wydaje mi sie najsensowniejszy. Moze byc i sam interfejs, moze byc sama konpozycja, ale razem dadza odpowiednik wielodziedziczenia.

0

Z tego co znalazłem w googlach to interfejs zabezpiecza na przed tym, żeby w klasach nie zabrakło odpowiednich funckji, które zdefiniowane są w interfejsie, jednak o kompozycjach nic nie mogłem znaleźć.

0

Kompozycja czyli zlozenie/zawieranie. Przykladowo:

class Config implements Configable
{
  public function getConfig() {...}
}

class Mysql implements DatabaseDriver
{
  public function query(){...}
}

class NewClass implements Configable, DatabaseDriver
{
  protected $Mysql;
  protected $Config;

  public function __construct()
  {
    $Mysql = new Mysql();
    $Config = new Config();
  }

  //Configable interface implementations
  public function getConfig() { return $Config->getConfig(); }

  //DatabaseDriver interface implementations
  public function query() { return $Mysql->query(); }

}
0

singleton

0

A ja mam pytanie, po co? Z tego wyjdzie Ci jedna klasa robiąca wszystko czyli defacto strukturalny kod. Nie lepiej po prostu dołączać poszczególne klasy jako pola? Ja dodatkowo zrobiłem u siebie zrobiłem podobnie jak we większości frameworkach abstrakcyjną klasę o nazwie Container, posiada ona pola load() i loadFromFactory które instancjują podaną klase i dołączają jako pola klasy która je wywołuje, po co te metody? Dzięki temu moge fajnie obsługować singletony, Container jak wykryje singleton to tworzy w polu referencje i programista nie musi nawet wiedzieć, że klasa jest singletonem.

0

Ja osobiscie po prostu przekazywalbym obiekty tych 2 klas, bez cudowania, bo sluza glownie jako narzedzia. Podane przeze mnie rozwiazanie jest szersze kontekstowo i jak autor uzna, ze mu sie przyda to tez moze byc :)

0

ja poprastu myślałem, że uda się uniknąć węwnątrz klasy czegoś takiego:

$inna_klasa = new Inna_klasa()

bo wg. mnie jest to tworzenie obiektu wewnątrz innego obiektu, a nie wiem, czy powinno się tak robić.

Jaka jedna cała klasa, wcale że nie jedna duża klasa mi po prostu chodzi jak mam dwie klasy config i mysql jak je dwie przekazywać do innych klas, a mam jeszcze pytanie, bo w programowania obiektowego dopiero się uczę czy jak wywolalismy jakąs metodę w klasie, to czy wewnątrz tej metody można wywołać inna metodę tej klasy ? Wiem, że można wywołać, ale czy tak przypadkiem nie powinno się robić ze względu na sposób programowania przyjęty w programowaniu obiektowym ?

0

Nie musi byc tworzenia, moze byc przekazane w konstruktorze. To tylko przyklad.

Co do

Jaka jedna cała klasa, wcale że nie jedna duża klasa mi po prostu chodzi jak mam dwie klasy config i mysql jak je dwie przekazywać do innych klas, a mam jeszcze pytanie [...]

To pytanie, stwierdzenie, czy moze przypuszczenie? Bo zlaczyles 3 zdania w jedno, nie dajac do zrozumienia, gdzie przebiegaja granice.

Wiem, że można wywołać, ale czy tak przypadkiem nie powinno się robić ze względu na sposób programowania przyjęty w programowaniu obiektowym ?

Bo?

0

Ok poprawiam zdanie:
Jaka jedna cała klasa ? Wcale, że nie jedna duża klasa. Chodzi mi po prostu o taką sytuację: mam dwie klasy config i mysql. Chcę je obydwie przekazywać do nowej klasy.

A jak je przekazać w konstruktorze ?

A co do sposobu pisania obiektowo to na pewno jest coś czego powinno się przestrzega w stylu pisania czy to skryptu czy programu obiektowego.

0

No to je po prostu przekazuj, czyli w ten sposob:

class Klasa
{
  protected $Mysql;
  protected $Config;

  public function __construct($Mysql, $Config)
  {
    $this->Mysql = $Mysql;
    $this->Config = $Config;  
  }
}

Co do przestrzegania - jest pare zasad, ale one sprowadzaja sie glownie do zachowywania przejrzystosci, logiki, jakosci i wysokiego zrozumienia tworzonego kodu. Co zwykle oznacza abstrakcje, uogolnianie, code reusability, odwzorowanie problemu na klasy/obiekty oraz trzymanie sie ustalonego planu klas. Oraz zrozumienie wad i zalet pojec: enkapsulacja, polimorfizm, izolacja i zaleznosc miedzyklasowa/miedzyobiektowa. I tak dalej.

0
johny_bravo napisał(a)

Co do przestrzegania - jest pare zasad, ale one sprowadzaja sie glownie do zachowywania przejrzystosci, logiki, jakosci i wysokiego zrozumienia tworzonego kodu. Co zwykle oznacza abstrakcje, uogolnianie, code reusability, odwzorowanie problemu na klasy/obiekty oraz trzymanie sie ustalonego planu klas. Oraz zrozumienie wad i zalet pojec: enkapsulacja, polimorfizm, izolacja i zaleznosc miedzyklasowa/miedzyobiektowa. I tak dalej.

Dokładnie o to mi chodziło. (o powyższy cytat)

PS. dzięki za pomoc z tym przykładem klasy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1