Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Martina 15. 10. 2013, 17:41:50
-
Ahoj, když uvnitř class použiju příkaz
$this->foo();
tak zavoám metodu s názvem foo(), když
$this->foo;
tak zavolam proměnnou foo, ale co je sakryš tohle za zápis?
$this->foo->bar();
Díky, M.
-
Zeby volani metody (bar) potomka (foo) tyto klasy?
-
Zeby volani metody (bar) potomka (foo) tyto klasy?
Spis volani metody promenne, ne?
-
Spis volani metody promenne, ne?
Můžeš to upřesnit? Děkuji. M.
-
Tady, prvni odpoved:
http://stackoverflow.com/questions/1385429/howto-chain-objects-in-php5-this-foo-bar-baz
Misto promenne
-
foo je proměnná nějakého typu, který má metodu bar, a tahle metoda je zavolána.
-
Sten a Jehovista to napsali správně.
class Bar {
public function barMethod() {
return ...;
}
}
class Foo {
/**
* $bar je typu bar
* @var Bar
*/
var $bar;
public function __construct() {
$this->$bar = new Bar(); //někde se instance třídy Bar musí dostat do $bar. Například v konstruktoru, ale je to jedno
}
function callBar(){
//volání metody barMethod na objektu typu Bar, který je v proměnné $bar
$this->$bar->barMethod();
}
}
Rozhodně to není volání potomka - potomek je pojem týkající se dědičnosti.
class Cat extends Animal {
Kočka je zvíře - má stejné vlastnosti a "rozumí stejným zprávám" (v ne-akademickém hantecu čti "má stejné metody") jako Zvíře, ale může přidávat vlastní. Kočka je v tomto případě potomek, zvíře předek. Jedná se o modelování vazby "potomek konkretizuje předka" nebo "potomek je předek".
Naproti tomu první příklad je tzv. kompozice. Tedy modelování vazby "Bar má Foo" nebo "Bar se zkládá z Foo".
Občas jsem zděšen, že si zde někdo takto zplete základní pojmy.
-
Sten a Jehovista to napsali správně.
class Bar {
public function barMethod() {
return ...;
}
}
class Foo {
/**
* $bar je typu bar
* @var Bar
*/
var $bar;
public function __construct() {
$this->$bar = new Bar(); //někde se instance třídy Bar musí dostat do $bar. Například v konstruktoru, ale je to jedno
}
function callBar(){
//volání metody barMethod na objektu typu Bar, který je v proměnné $bar
$this->$bar->barMethod();
}
}
Rozhodně to není volání potomka - potomek je pojem týkající se dědičnosti.
class Cat extends Animal {
Kočka je zvíře - má stejné vlastnosti a "rozumí stejným zprávám" (v ne-akademickém hantecu čti "má stejné metody") jako Zvíře, ale může přidávat vlastní. Kočka je v tomto případě potomek, zvíře předek. Jedná se o modelování vazby "potomek konkretizuje předka" nebo "potomek je předek".
Naproti tomu první příklad je tzv. kompozice. Tedy modelování vazby "Bar má Foo" nebo "Bar se zkládá z Foo".
Občas jsem zděšen, že si zde někdo takto zplete základní pojmy.
Ano, ano toto su zaklady OOP a kto to s programovanim mysli vazne tieto veci by mu mali byt naprosto jasne. Ako sa u nas hovori, aj ked ta o pol noci zobudia...
-
"rozumí stejným zprávám"
Občas jsem zděšen, že si zde někdo takto zplete základní pojmy.
To je proto že se začátečníkům tlačí do hlavy nesmysly jako třeba zmíněné zprávy pro objekty. Kdyby se jim to řeklo tak jak je to ve skutečnosti, tedy že metoda je převlečená funkce s jedním skrytým parametrem s instancí objektu, pak to není možné nepochopit.
-
Sten a Jehovista to napsali správně.
class Bar {
public function barMethod() {
return ...;
}
}
class Foo {
/**
* $bar je typu bar
* @var Bar
*/
var $bar;
public function __construct() {
$this->$bar = new Bar(); //někde se instance třídy Bar musí dostat do $bar. Například v konstruktoru, ale je to jedno
}
function callBar(){
//volání metody barMethod na objektu typu Bar, který je v proměnné $bar
$this->$bar->barMethod();
}
}
Rozhodně to není volání potomka - potomek je pojem týkající se dědičnosti.
class Cat extends Animal {
Kočka je zvíře - má stejné vlastnosti a "rozumí stejným zprávám" (v ne-akademickém hantecu čti "má stejné metody") jako Zvíře, ale může přidávat vlastní. Kočka je v tomto případě potomek, zvíře předek. Jedná se o modelování vazby "potomek konkretizuje předka" nebo "potomek je předek".
Naproti tomu první příklad je tzv. kompozice. Tedy modelování vazby "Bar má Foo" nebo "Bar se zkládá z Foo".
Občas jsem zděšen, že si zde někdo takto zplete základní pojmy.
jen bych upřesnil že to nemá být $this->$bar ale $this->bar :)
-
Kolemjdoucí Mám zcela opačný názor. Takovéto chyby vznikají především díky tomu, že se lidi učí sami "jen praktické věci" a na formální věci se vyprdnou, bo "to je teorie, tak to přece není a zajímá mě praxe". To vede k tomu, že nechápou ani základní návrhové vzory, stejně jako jak v objektech zachytit jaké vazby.
Každý jazyk/prostředí je pouze implementací formální teorie. Např. to, že zaslání zprávy = volání metody. Nedávno kolega nevěřícně koukal na třídu Messenger v MVVM Light frameworku, která je zobecněním zasílání zpráv objektům* a došlo mu to až ve chvíli, kdy jsem mu sdělil tuto poučku.
Ne vždy je to samozřejmě chyba pouze těch konkrétních lidí - mnoho knih nebo učebních materiálů se věnuje právě jen implementačním detailům a myšlenku, která je za tím ("The Big Picture"), nechává bez povšimnutí. Nicméně pokud se chceš bavit na toto téma, založ na to prosím separátní thread. Sem to IMHO nepatří a pokud vím, tak toto fórum nemá moderátora a tudíž to nikdo jiný neudělá.
* Jde tam o to, že na mnoho objektů, na kterých potřebuješ volat metody, nemáš referenci. Občas znáš typ, někdy ani to ne.
-
Ryder Díky. Až se zas budu snažit psát v PHP, čemuž se vyhýbám téměř jako čert kříži, budu na to myslet :-) .
-
Kolemjdoucí Mám zcela opačný názor.
Tak to se nemáme o čem bavit ;)