Prosím o radu s PHP OOP

Re:Prosím o radu s PHP OOP
« Odpověď #45 kdy: 15. 05. 2015, 16:29:55 »
Jinak zakázání abstract private není konstrukce navíc, ale naopak restrikce navíc, stejně jako "devirtualizace"
private metod, z který to vychází, je opět pravidlo navíc a nikoli pravidlo namíň, takže ani ta argumentace
až tak nesedí....

Ono na to jde koukat také jinak: To, že jsou privátní metody nevirtuální, je spíše jen pouhý důsledek Java pravidel. Java rozdělení metod na virtuální a nevirtuální v podstatě nezná, takže klidně se na to můžeme koukat tak, že všechny metody jsou virtuální. Když se volá metoda, tak se najdou metody, které jsou accessibile, a z nich se nějaká vybere. Podobně při deklaraci metody - projdou se accessibile metody v předcích a pokud je tam nějaká se stejnou signaturou, provede se její overriding. Pokud se například v abstraktní třídě deklaruje metoda abstract void foo(), tak jediný, kdo ji bude moci implementovat, budou třídy ze stejného balíčku, protože jiné třídy prostě tuto metodu neuvidí. A přitom foo() virtuální jistě je.


Kit

Re:Prosím o radu s PHP OOP
« Odpověď #46 kdy: 16. 05. 2015, 07:22:52 »
napriklad plky voci chybajucej viacnasobnej dedicnosti v jave

Vícenásobná dědičnost chybí v mnoha jazycích a nikde k tomu nemají plnohodnotné uspokojivé řešení.
Konstrukty kterým programátor nerozumí, tak je nemusí používat.

Vícenásobná dědičnost v PHP nechybí. Rozumný vývojář se jí prostě vyhne.

m

Re:Prosím o radu s PHP OOP
« Odpověď #47 kdy: 16. 05. 2015, 09:34:38 »
Vícenásobná dědičnost v PHP nechybí. Rozumný vývojář se jí prostě vyhne.

Vyhne se jí jenom proto že musí, neboť autoři mnoha jazyků se ji neobtěžovali implementovat. Přirozená dědičnost je včetně vícenásobné.

Kit

Re:Prosím o radu s PHP OOP
« Odpověď #48 kdy: 16. 05. 2015, 10:03:38 »
Vícenásobná dědičnost v PHP nechybí. Rozumný vývojář se jí prostě vyhne.

Vyhne se jí jenom proto že musí, neboť autoři mnoha jazyků se ji neobtěžovali implementovat. Přirozená dědičnost je včetně vícenásobné.

Vícenásobná dědičnost je zbytečná, protože není přirozená. Dali ji jen do C++, ale evidentně to byla zásadní chyba.

Zkus uvést příklad použitelné násobné dědičnosti. Všechny případy, které jsem dosud viděl, byly jen uměle vykonstruované a neměly odraz v realitě.

kozzi11

Re:Prosím o radu s PHP OOP
« Odpověď #49 kdy: 16. 05. 2015, 12:20:59 »
Vícenásobná dědičnost v PHP nechybí. Rozumný vývojář se jí prostě vyhne.

Vyhne se jí jenom proto že musí, neboť autoři mnoha jazyků se ji neobtěžovali implementovat. Přirozená dědičnost je včetně vícenásobné.

Tak to neni zcela pravda, ja se ji vyhybam i v jazycich ktere ji podporuji, protoze pro me jeji vyuziti toho zas tolik neprinasi.


kozzi11

Re:Prosím o radu s PHP OOP
« Odpověď #50 kdy: 16. 05. 2015, 12:39:38 »
napriklad plky voci chybajucej viacnasobnej dedicnosti v jave

Vícenásobná dědičnost chybí v mnoha jazycích a nikde k tomu nemají plnohodnotné uspokojivé řešení.
Konstrukty kterým programátor nerozumí, tak je nemusí používat.

Vícenásobná dědičnost v PHP nechybí. Rozumný vývojář se jí prostě vyhne.

JJ jeji potreba je dosti sporna a pokud nekdy neco takoveho potrebujeme tak si ve vetsine pripadech clovek vystaci s kompozici. Napriklad jazyk D to resi elegantne:
Kód: [Vybrat]
module main;
import std.stdio;

struct Camera
{
void takePicture()
{
writeln("click");
}
}

class Phone
{
void call()
{
writeln("ring ring");
}
}

class CameraPhone : Phone
{
Camera camera;
alias camera this;
}

void main(string[] args)
{
auto phone = new CameraPhone();
phone.call();
phone.takePicture();
}

neceho podobneho jde v php taky dosahnout a to bud traitama:

Kód: [Vybrat]
<?php
trait TCamera
{
    public function 
takePicture() 
    {
        echo 
"click" PHP_EOL;
    }
}

trait 
TPhone
{
    public function 
call()
    {
        echo 
"ring ring" PHP_EOL;
    }
}

class 
Camera
{
    use 
TCamera;
}

class 
Phone
{
    use 
TPhone;
}

class 
CameraPhone
{
    use 
TCamera,TPhone;
}

$phone = new CameraPhone();
$phone->takePicture();
$phone->call();

nebo pres magicke metody __call, __callStatic,...

Kit

Re:Prosím o radu s PHP OOP
« Odpověď #51 kdy: 16. 05. 2015, 12:59:43 »
Vícenásobná dědičnost v PHP nechybí. Rozumný vývojář se jí prostě vyhne.

JJ jeji potreba je dosti sporna a pokud nekdy neco takoveho potrebujeme tak si ve vetsine pripadech clovek vystaci s kompozici. Napriklad jazyk D to resi elegantne:
Kód: [Vybrat]
... class CameraPhone : Phone ...
neceho podobneho jde v php taky dosahnout a to bud traitama...
nebo pres magicke metody __call, __callStatic,...

Tedy definovat CameraPhone jako telefon, který umí fotit. Šel by i fotoaparát, se kterým se dá telefonovat (také existují). Prostě nedefinovat Pegase jako křížence ptáka a koně, ale jako koně, který umí létat.

Traitům se vyhýbám kvůli snížení počtu WTF v kódu. Z podobných důvodů šetřím s metodami __call() a __callStatic(). Své použití však určitě mají - např. v adaptérech.