Prosím o radu s PHP OOP

Jan Oktábec

Prosím o radu s PHP OOP
« kdy: 10. 05. 2015, 15:20:06 »
Mám problém s následujícím kódem. Místo provedení příkazu:

   echo "I need to do this operation :/...";

se zobrazí tato hláška:

   Fatal error: Call to private method B::fun1() from context 'A' in C:\Server\www\classproblem.php on line 6

Ačkoli kód vypadá nesmyslně (volání funkce fun1 v constructu objektu A, ačkoli funkce fun1 je v objektu B, který je potomkem objektu A), je v případě mého projektu nutností. Proč to nejde? Mám místo $this v příkazu "$this->fun1();" použít něco jiného nebo funkce fun1 musí být public? :o


class A {
   public function __construct ()
   {
      $this->fun1();
   }
}

class B extends A {
   private function fun1 ()
   {
      echo "I need to do this operation :/...";
   }   
}

$a = new B();


Mockát děkuji za odpovědi  :) :D ;)
Jan Oktábec


Jan Oktábec

Re:Prosím o radu s PHP OOP
« Odpověď #1 kdy: 10. 05. 2015, 15:23:14 »
Doplnění: Z důvodu bezpečnosti bych byl radši, aby zůstala private :/ Jinak když ji změním na public, tak to funguje...

v

Re:Prosím o radu s PHP OOP
« Odpověď #2 kdy: 10. 05. 2015, 15:32:17 »
co zkusit protected  function fun1 () místo    private function fun1 () ?
jenom tip, php nepoužívám

Hmmm

Re:Prosím o radu s PHP OOP
« Odpověď #3 kdy: 10. 05. 2015, 15:38:47 »
Ano, protected by to malo vyriesit. Protected znamena, ze bude private v materskej triede a aj v tej, ktora ju rozsiruje.

Kit

Re:Prosím o radu s PHP OOP
« Odpověď #4 kdy: 10. 05. 2015, 15:45:29 »
Vzhledem k tomu, že B není A, není v daném případě možné použít dědičnost.


kozzi11

Re:Prosím o radu s PHP OOP
« Odpověď #5 kdy: 10. 05. 2015, 16:57:54 »
Mám problém s následujícím kódem. Místo provedení příkazu:

   echo "I need to do this operation :/...";

se zobrazí tato hláška:

   Fatal error: Call to private method B::fun1() from context 'A' in C:\Server\www\classproblem.php on line 6

Ačkoli kód vypadá nesmyslně (volání funkce fun1 v constructu objektu A, ačkoli funkce fun1 je v objektu B, který je potomkem objektu A), je v případě mého projektu nutností. Proč to nejde? Mám místo $this v příkazu "$this->fun1();" použít něco jiného nebo funkce fun1 musí být public? :o


class A {
   public function __construct ()
   {
      $this->fun1();
   }
}

class B extends A {
   private function fun1 ()
   {
      echo "I need to do this operation :/...";
   }   
}

$a = new B();


Mockát děkuji za odpovědi  :) :D ;)
Jan Oktábec


abstract class A {
        public function __construct ()
        {
                $this->fun1();
        }

        abstract protected function fun1();
}

class B extends A {
        protected function fun1 ()
        {
                echo "I need to do this operation :/...";
        }   
}

$a = new B();


karel

Re:Prosím o radu s PHP OOP
« Odpověď #6 kdy: 10. 05. 2015, 18:09:25 »
Prasím, prasíš, prasíme

tdvorak

Re:Prosím o radu s PHP OOP
« Odpověď #7 kdy: 11. 05. 2015, 06:14:52 »
Vzhledem k tomu, že B není A, není v daném případě možné použít dědičnost.
To je zas rada, jak noha. Člověk by čekal, že když se pořád odvoláváš na OOP, dědičnosti a návrhové vzory, tak to teď využiješ a dobře poradíš. A místo toho čteme zas jen fragment jak z automatického generátoru textů.

perceptron

Re:Prosím o radu s PHP OOP
« Odpověď #8 kdy: 11. 05. 2015, 08:53:55 »
pan Oktabec,
vas kod *je* nezmyselny a popiera OOP. to ze je nutnostou vo vasom projekte a chcete prelomit oop, znamena len to, ze vas objektovy dizajn je zly.

ked mate triedu Netvor (vase A) a Trolla ktora dedi od Netvora (vase B), vy chcete
aby po vytvoreni vseobecneho Netvora sa zavolala metoda troll->sedPodMostom().

Netvor (vase A) je vseobecna trieda ktora nevidi a nepotrebuje a nechce vidiet do metod podtried pretoze by nebola znovupouzitelna

vy si myslite ze ked vyrobite Trolla a priradite ho do Netvora, zrazu trieda Netvor bude magicky vidiet do PRIVATNYCH metod Trolla (troll->dajSmrad()) ale takto to nefunguje

jedno z rieseni: vyrobit v Netvorovi protected metodu 'fun1', v Trollovi (a Drakovi a Hydre) ju prekryt.

alebo dajte konkretnejsi priklad namiesto A a B a fun1

Citace
To je zas rada, jak noha.
esteze tam nie su gettery a settery, to by sme si pochrochtali blahem

Re:Prosím o radu s PHP OOP
« Odpověď #9 kdy: 11. 05. 2015, 09:18:44 »
nez se clovek do cehokoliv pusti mel by mit aspon nezbytne teoreticke zaklady. je jedno jestli se jedna o kachlickovani koupelny, mdrání nebo OOP.
Děkuji za možnost editace příspěvku.

Re:Prosím o radu s PHP OOP
« Odpověď #10 kdy: 11. 05. 2015, 09:57:05 »
pan Oktabec,
vas kod *je* nezmyselny a popiera OOP. to ze je nutnostou vo vasom projekte a chcete prelomit oop, znamena len to, ze vas objektovy dizajn je zly.

ked mate triedu Netvor (vase A) a Trolla ktora dedi od Netvora (vase B), vy chcete
aby po vytvoreni vseobecneho Netvora sa zavolala metoda troll->sedPodMostom().

Netvor (vase A) je vseobecna trieda ktora nevidi a nepotrebuje a nechce vidiet do metod podtried pretoze by nebola znovupouzitelna

vy si myslite ze ked vyrobite Trolla a priradite ho do Netvora, zrazu trieda Netvor bude magicky vidiet do PRIVATNYCH metod Trolla (troll->dajSmrad()) ale takto to nefunguje
...
+1
Pěkně.

Citace
To je zas rada, jak noha.
esteze tam nie su g*y a s*y, to by sme si pochrochtali blahem
???
Ani naznačovat, ani naznačovat!!!

Re:Prosím o radu s PHP OOP
« Odpověď #11 kdy: 11. 05. 2015, 09:57:30 »
nez se clovek do cehokoliv pusti mel by mit aspon nezbytne teoreticke zaklady. je jedno jestli se jedna o kachlickovani koupelny, mdrání nebo OOP.
Modrání?

j

Re:Prosím o radu s PHP OOP
« Odpověď #12 kdy: 11. 05. 2015, 10:30:31 »
esteze tam nie su gettery a settery, to by sme si pochrochtali blahem
Jeste ze phpko neumi inline asm ... to bych videl na nejakej ten long jump, sak jit to prece musi.

----
A to si predstav, ze ti takovouhle prasecinu pak klidne prodaj.

Hmmm

Re:Prosím o radu s PHP OOP
« Odpověď #13 kdy: 11. 05. 2015, 10:37:24 »
Gettery a settery nie su problem. Problem je programator, ktory ich nevie spravne pouzivat alebo ich uz len z principu zavrhuje.

Logik

  • *****
  • 1 050
    • Zobrazit profil
    • E-mail
Re:Prosím o radu s PHP OOP
« Odpověď #14 kdy: 11. 05. 2015, 11:47:39 »
Nevím, co tu blbnete s trolama a netvorama. Uvedenej pattern je úplně normální, akorát by pro účely dokumentace a syntax checking mělo
bejt, že třída A je označena abstract a je v ní abstraktní metoda func1. To je celé na rovině "myšlenkové".

Na rovině faktické pak má PHP zmršenej koncept dědičnosti, takže tam nejde udělat abstraktní virtuální metoda private, takže to takto udělat nejde a musí holt ta metoda bejt protected. Pokud to chceš fakt mít private, tak není jiná cesta, než tu funkcionalitu vydělit do speciální třídy a dát ji jako private membera té třídy - ale já bych se s tím neštval :-)