Autor Zpráva
Magnus123
Profil
Ahoj.

Chtěl bych se zeptat, je někdy vhodné použít takovýto způsob kódu?

<?php

header("Content-Type: text/html; charset=UTF-8");

class Uzivatel
{

protected $id = 10;
public $zpravy;

  function nastaveniZprav()
  {
  
  $this->zpravy = new Zpravy;
  
  }

}


class Zpravy extends Uzivatel
{

  public function napisZpravu($komu,$zprava)
  {
  
  return "Poslal jsi zprávu uživateli: ".htmlspecialchars($komu)."<br />".htmlspecialchars($zprava)."<br />ID: ".$this->id;
  
  }

}


$uzivatel = new Uzivatel;
$uzivatel->nastaveniZprav();

echo $uzivatel->zpravy->napisZpravu("Magnus","Ahoj, jak se máš?");

 
?>

To znamená, abych nemusel vytvářet novou instanci ($zpravy = new Zpravy), ale volat to přes instanci $uzivatel.

Zajímá mě, zda má toto nějaké uplatnění, nebo se to prostě nedělá. :-)
Děkuji za rady.
Ugo
Profil
Uplatnění to má, dělá se to hodně a občas to bývá jediné řešení jak dosáhnout pěkné syntaxe :) Ale už bych nedělal ze zpráv potomka Uživatele
Magnus123
Profil
Ugo, díky. ;-)

Mohu se zeptat, jak mám pak udělat, aby proměnná $id nebyla ve třídě definována, ale definovala se až v metodě ve třídě Uzivatel?

Kdybych měl např.

<?php

class Uzivatel
{
 
protected $id;
public $zpravy;
 
  function nastav_id($nejake_id)
  {

  $this->id = $nejake_id;

  }

  function nastaveniZprav()
  {
  
  $this->zpravy = new Zpravy;
  
  }
 
}

?>

Pokud to udělám takto, tak se mi pomocí:

$uzivatel->nastav_id(10);
echo $uzivatel->zpravy->napisZpravu()

dané ID nezobrazí.
Bertram
Profil
Ahoj, id uživatele ti metoda nastav_id() nastaví, ale kvůli zrušení dědičnosti ho už ve třídě Zpravy neuvidíš (nedědíš), což je mimochodem správně, přece když se ve třídě Zpravy zeptáš na identifikátor, zřejmě by to měl být identifikátor zprávy a né uživatele.
A hlavně neplatí, že by zpráva byla nějakým druhem uživatele.
Zkus vypustit to, že odesílatel bude třída Uzivatel a vytvořit třídu Zprava na základě toho co je pro zprávu typické.
např.
$zprava = new Zprava ($od, $komu, $obsah);
Nox
Profil
Většinou to je tak, že: *new NejakaTrida* je - pokud to vím správně - uvnitř třídy ok buď když jde o factory třídu/metodu, nebo když je ten objekt využíván jen interně ... anebo jako výchozí možnost, pokud to dává smysl ... tady ale ne (lidé posílají různé texty různým lidem).
Lepší by bylo nechat to prostě nastavit

$zprava = new Zprava ($od, $komu, $obsah);
$uzivatel->nastavZpravu($zprava);

Jinak je asi dobré dávat třídám název jen jako jednotné číslo - protože 1 objekt reprezentuje 1 věc. Pokud má v sobě uchovávat nějakou kolekci, je asi lepší to dát jako KolekceZprav nebo tak (nevim jak přesně česky) ... a muze pak třeba uchovávat pole objektů Zprava
Bertram
Profil
Nox:
Ahoj, co bude vykonávat tento kód?
$uzivatel->nastavZpravu($zprava);
Já bych uvažoval, že jde o událost (napsat zprávu), kterou uživatel pouze vyvolá, nikoliv zpracovává, to by se mohla třída Uživatel pěkně rozrůst.
Ale já se techniky, jak vytvořit nějaký objektový celek teprve učím, takže bych rád zjistil co jsi tím zamýšlel.
Magnus123
Profil
Jaké je tedy podle vás nejlepší řešení, jak to udělat, když metod pro práci se zprávami je víc? Např. poslání zprávy, načtení přijatých, nastavení ignorovaných uživatelů, mazání zpráv apod.
Dát to do třídy Uzivatel?
Nox
Profil
Bertram:
to nevim, bral jsem to jen podle nastaveniZpravy z původního textu

Magnus123:
Dát to do třídy, která s tím má co dočinění ... uživatel reprezentuje uživatele, on teda teoreticky uživatel dělá kde co, ale takto to nebral, to by pak šlo vztáhnout na vše. Třeba v Nette jsou skupina tříd Mailer (různé způsoby odesílání zpráv) a Message (reprezentuje zprávu a její vlastnosti). Takže mít třeba 1 na manipulaci se zprávami a 1 na zprávu
Magnus123
Profil
Takže vytvořit samostatnou třídu Zprava, která nebude potomkem třídy Uzivatel?
Mně přišlo lepší udělat to k uživateli, protože nemusím ke každé třídě vytvářet novou instanci.
Nox
Profil
Být potomkem je velmi silná vazba, vyjadřuje to, že jsou ty třídy téměř stejné, jen potomci jsou specializací ... používá se vyjádření je

Tzn. by bylo Zpráva je Uživatel ... což není pravda. Pes je Savec, to je ok.

Tu instanci bys dělal stejně, ne?

Každopádně třída je jen předpis, že se dělají instance je jasné ....

(ale v pohodě, klidně se ptej, o to jde se to naučit)

Jak je snad vidět, OOP je hodně podobné logickému myšlení dle reálného světa a objektů ... dopis není člověk, pošta není dopis - máme objekty dopis, člověk, pošta ... dopis je konkrétní dopis, člověk je nějaký člověk a může jít o odesilatele, pošta zprostředkovává odesílání a příjmání pošty ...
Magnus123
Profil
Dělám s OOP teprve chvíli, takže sám od sebe neočekávám, že se nebudu muset ptát i na hlouposti. :-)

Moc děkuji za vaše rady.

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: