Autor Zpráva
Flash
Profil *
Hezký den přeju. Tak nějak sem v poslední době skejsnul u OOP v PHP a měl bych takovej začátečnickej dotaz. Budu mít tři soubory :

index.php :

 <?php
  require_once 'class1.php';
  $render = new render;
  require_once 'class2.php';
  $main = new main;
 ?>

class1.php :

 <?php
 class render
 {
   public function write($message)
   {
   echo $message;
   }
 }
 ?>

a class2.php

 <?php
 class main
 {
   function main ()
   {
   }
 }
 ?>


no a ted budu potřebovat zavolat v constructoru třídy MAIN metodu WRITE ze třídy RENDER. Abych se k této metodě dostal z třídy main musím jí zavolat staticky tedy :

render::write('text');

jenže to mi zrovna dvakrát nevyhovuje. Jak lze přistupovat k metodám jiných tříd anichž bych je musel volat staticky?? Nepohrdnul bych ani článkem s tématikou volání metod, kdyby někdo o něčem věděl.

Dik moc
Keilew
Profil
Z principu OOP je tato otázka blbost. Třída je soubor dat (proměnné) a metod (function) pro práci s nimi. Jakmile musíš pro práci s daty jedné třídy volat metodu třídy jiné, je obyčejně něco špatně. Často jde o tzv. těsnou vazbu. Takže by to chtělo nastudovat opravdové vlastnosti návrhů OOP, není to totiž jen o zabalení funkcí a proměnných do bloku s názvem class.
Flash
Profil *
Keilew
Jakmile musíš pro práci s daty jedné třídy volat metodu třídy jiné, je obyčejně něco špatně.

Ano jistě to chápu, ale to není zrovna tato situace. Nevolám metodu z jiné třídy, abych mohl pracovat s daty původní třídy. Volám metodu ze třídy, která nemá s tou druhou vůbec nic společného a ani nemá vliv na její funkci. Volám funkce, které slouží pro tvorbu log a debug souborů.
Keilew
Profil
Flash
Pak jedině static, nebo prostě volat nějakou funkci, která není součástí žádného modelu, nebo volat pořes instanci objektu.
Joker
Profil
Keilew
Já bych to trochu upřesnil:
Metody jiné třídy ve svojí třídě používat jde- obvykle tak, že se z nich udělají metody té svojí třídy :-)
Pokud funkčnost mojí třídy má obsahovat funkčnost jiné třídy, obvykle je to ze dvou důvodů:
- ve skutečnosti ta moje třída i ta druhá patří do nějaké větší kategorie objektů, kterým je toto chování společné. Příklad: řekněme, že třída Motorka má metodu akceleruj(). Tu bych potřeboval i pro třídu Automobil. Ale ve skutečnosti akcelerace není funkčnost specifická pro motorku, ale obecná pro všechny dopravní prostředky (resp. pro jakýkoliv objekt, ale zjednodušme to).
Pro takové situace je v OOP dědění: správné řešení by bylo zavést například třídu Dopravní prostředek, která by měla mj. metodu akceleruj() a třídy Motorka a Automobil by byly její specializace a metodu by zdědily.

- ve skutečnosti je jedna z těch tříd součástí druhé. Například řekněme, že mám třídu Motor, která má metodu nastartuj() a chci jí využít i pro třídu Automobil. Ve skutečnosti je ale motor součástí automobilu s veškerou svou funkčností a atributy.
Taková situace se v OOP řeší skládáním: třída Automobil by měla obsahovat atribut typu Motor.
Keilew
Profil
Joker
Ano, máš naprostou pravdu, jen jsem to nechtěl pitvat. Zahrnul jsem to do tvrzení, že by to chtělo nastudovat opravdové vlastnosti návrhů OOP;-)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0