Autor Zpráva
xixli
Profil
Ahoj,
existuje nejaký rozumný spôsob ako zavolať funkciu z rodičovského objektu? (brr, nenapadol ma lepší názov ;-)
Lepšie popíše príklad:

<?php
class foo{
function __construct()
{
global $bar;
$bar->something("abc");
}
}

class bar{
private $foo;

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

function something($var) { echo "something"; }
}
$bar = new bar;

?>

Toto však samozrejme nefunguje, lebo chceme volať z $bar ešte pred jeho inicializovaním.
Dalo by sa to riešiť takto:

<?php
class foo{
function __construct()
{
global $bar;
$bar->something();
}
}

class bar{
public $foo;

function something() { echo "something"; }
}
$bar = new bar;
$bar->foo = new foo;

?>

ale to nemusí vyhovovať pre dve veci:
1) nemusím chcieť mať bar::foo ako public
2) mám v hlavnom kóde to čo by mohlo byť schované

Nejaký lepší nápad?
kaifman
Profil
nejak nechapu k cemu by to melo byt dobre ? muzes uvest nejakej priklad ?

btw global imho do oop teda moc nepatri
xixli
Profil
Konkrétny príklad:
Mám triedu manager (stará sa o pluginy, templaty) a mám triedu parser (parsovanie templatov, niečo ako smarty).
Manager sa teda stará o triedu parser (a ďalšie). Chcem mať objekt parser ako private premennú v manageri, nech mi tam do toho nelezú iné skripty.
V manager::__construct inicializujem parser ($this->parser=new parser) a v parser::__construct volám manager::configVar() (potrebujem nejaké konfigy, nedá sa to preložiť inam, bol by z toho bordel). V parser::__construct ale nemôžem použiť global $manager; $manager->configVar() pretože manager ešte nie je inicializovaný. Samozrejme manager::configVar ako statickú funkciu.

Global sa v oop dá použiť úplne v poho a nie je to proti srsti; napríklad global $db; $db->getRows(...)
nebudem predsa do každej triedy pchať referenciu na $db, keď cez global to ide krásne jednoducho (na to aj je určený)
kaifman
Profil
zkus toto

<?php
class foo{
function __construct($bar)
{
$bar->something("abc");
}
}

class bar{
private $foo;

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

function something($var) { echo "something"; }
}

$bar = new bar;
?>


Nicmene zapremyslel bych nad odpovednosti trid, zda se mi to take ledajake ale neznam uplne tvou aplikaci, takze mozna jen pocit

ad global samozrejme ze to neni proti strsti ale imho je to proti zakladnim principum oop, kdy je prave snaha vyvarovat se takovymto kontrukcim. Objekty maji nejake rozhrani diky kterym spolu komunikuji a pokud to delas pres global, objekt ztraci svoji samostanost, a tak trochu to ztraci ten punc OOP o ktery ti zajiste jde :-)

nerikam ze to je spatne nebo ze to nebude fungovat, myslim si ale ze kdyz resis takove veci jako private a public tak je skoda ze to pak takhle zaplacnes takovou global berlickou
xixli
Profil
kaifman> díky moc, takéto niečo ma nenapadlo ;-). už som to aj implementoval
no myslím si že oop návrh mám celkom dobrý, nie je to nejaká katastrofa :-)
keď tak, môžem ti poslať nejakú rozumnejšiu beta verziu (bude to cms pod gnu gpl), ale ešte je okolo toho veľa vývoja...

ad global>ako som už napísal, nemá pre mňa zmysel pchať do každého pluginu, do každej triedy referencie napr. na manager prípadne db. Pluginy si ho v pohode môžu zavolať cez global.
(a v podstate mám také iba 2 triedy, a to je manager a db). Ten manager je skoro niečo také ako public class v jave (podotýkam že v jave sa nevyznám, tak ma neukameňujte ;-))
Toto téma je uzamčeno. Odpověď nelze zaslat.

0