Autor Zpráva
Marek123
Profil *
Potreboval bych poradit s nasledujucim kodem:

<?php
class nacitana
{
public function write()
{
echo "nacitana ";
}
}

class zaklad
{
public function __construct()
{
$nacitana = new nacitana();
}
}

class rozsirena extends zaklad
{
public function __construct()
{
parent::nacitana->write();
}
}
?>

Chtel bych v class rozsirena pouzivat funkci z classy nacitana, vedel by mi nekdo poradit, resp. usmernit ci mam spravne mysleni?
joe
Profil
Nějak jsem to udělal, ale nevím jestli to je správný přístup :-) Dědění v php snad ani nepoužívám...

<?php
class nacitana  {

  public function write() {
    echo "<b>write</b><br>";
  }
  
}

class zaklad {
  
  private $nacitana;
  
  public function __construct() {
    $this->nacitana = new nacitana();
    echo "vytvorena: zakladni<br>";
    $this->nacitana->write();
  }
  
  public function getNacitana() {
    return $this->nacitana;
  }
 
}

class rozsirena extends zaklad { 
  public function __construct() { 
    parent::__construct();
    echo "vytvorena: rozsirena<br>";
    parent::getNacitana()->write();
  }
}

$rozsirena = new rozsirena();
 
?>
MaxwellDemon
Profil
tak předně co se tvojí ukázky týče - základem úspěchu je vědět, jestli tu proměnnou $nacitana má mít možnost měnit jenom ta parent třída (a ostatním maximálně getovat její hodnotu) ... pak je na místě řešení, co máš dole od joea ... v případě, že ta proměnná je děděná a má bejt editovatelná i v child classech, tak by nebyla private, ale protected ... a pak na ní v těch vyděděných třídách (rozsirena) budeš přistupovat úplně normálně jako k jejich vlastnímu memberovi ... $this->nacitana

s použitím member funkcí je to stejný ... pokud chceš, aby byla viditelná jenom v parent třídě, pak bude private ... pokud má být viditelná jenom ve všech vyděděných classech, bude protected ... pokud má být viditelná a volatelná odevšud, pak bude public

takže ten tvůj kód by vypadal v nejjednodušší podobě následovně

<?php
class nacitana
{
public function write()
{
echo "nacitana ";
}
}

class zaklad
{
protected $nacitana = null; // bez tohodle bude mit ta promenna lokalni platnost v ramci funkce a neuvidis na ni nikde jinde nez v tom konstruktoru (tak jak jsi to prve napsal)

public function __construct()
{
$this->nacitana = new nacitana();
}
}

class rozsirena extends zaklad
{
public function __construct()
{
parent::__construct();
$this->nacitana->write();
}
}
?>
MaxwellDemon
Profil
teď to po sobě čtu a pokud má být viditelná jenom ve všech vyděděných classech, bude protected má být správně - pokud má být viditelná jenom v parent a ve všech vyděděných classech, bude protected (nebude volatelná zvenčí) :-)

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