Mar 10

Pływający kotek, czyli o korzystaniu z metod klasy A w obiekcie B.

Tag: PHPskowron @ 04:45

pływający kotekDzisiaj Bartek odkrył interesującą rzecz o której ani On ani ja wcześniej nie wiedzieliśmy. Być może i ktoś z Was również o tym nie wie, więc chętnie opowiemy :) Generalnie chodzi o to że… koty nie pływają pod wodą…



przyjrzyjmy się przykładowemu kodowi:

WYNIK:
sink and die

Gdyby kot chciał pływać pod wiodą i oddychać niczym ryba to niestety zginie…

WYNIK:
ok we can swim above water

Natomiast gdyby nasz kot oddychał jak każdy inny to na powierzchni wody na pewno uda mu popływać (o ile ma ochotę :) ).

Mówiąc językiem technicznym: w obiekcie można wywoływać metody z innych klas w sposób statyczny. Natomiast są one wywoływane z poziomu tego obiektu, czyli tak jak gdyby chwilowo były zaimplementowane w tym obiekcie ($this wskazuje na ten obiekt).

A może ktoś zna albo ma pomysł na jakieś praktyczne wykorzystanie tego rozwiązania?

2 Responses to “Pływający kotek, czyli o korzystaniu z metod klasy A w obiekcie B.”

  1. Rafał Piekarski says:

    Pytacie o praktyczne wykorzystanie… Ależ ono jest BANALNE! I na przykład w podobny sposób działa język Ruby. Tylko, że w nim nazywa się to Modułami ( keyword: module).

    A samo wykorzystanie pozwala na “prymitywne” bo prymitywne ale jednak rozszerzanie możliwości już istniejących klas w PHP o nowe funkcje właśnie dzięki takim zakresom zmiennych (tak coś takiego jeśli się nie mylę nazywa się w C++).

    Ale dość gadania, czas na przykład:

    class Animal {
    public function Walk(){
    echo “animal {$this->name} is walking”;
    }
    public function Eat() {
    echo “animal {$this->name} is eating”;
    }
    }

    class Mammal {
    public function CleanUpFur(){
    echo “Mammal {$this->name} is cleaning itself”;
    }
    }

    class Cat {

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

    public function Hunt(){
    Animal::Walk();
    $this->Bite();
    Animal::Eat();
    Mammal::CleanUpFur();
    }

    private function Bite(){
    echo “Rrrroarrr! “;
    }
    }

    $kotek = new Cat(’Mruczek’);

    >> animal Mruczek is walking
    >> Rrrroarrr!
    >> animal Mruczek is eating
    >> Mammal Mruczek is cleaning itself

    Taka technika pozwala na rozszerzanie mozliwości obiektów bez “zaśmiecania” ich przestrzeni nazw zbędnymi funkcjami.

    (przykład jest tylko obrazowy i pisany z głowy.)

    Ale jednak wygodniejsze ( bo pozbawione odwoływania się do składowych przez ::) jest zwykłe rozszerzanie możliwości klas (keyword: extends).

    Co Wy na to?

  2. skowron says:

    Ale jednak wygodniejsze ( bo pozbawione odwoływania się do składowych przez ::) jest zwykłe rozszerzanie możliwości klas (keyword: extends).

    no właśnie… stosowanie extends jest zdecydowanie ładniejszym i bardziej przejrzystym rozwiązaniem. Aczkolwiek idąc Twoim tokiem rozumowania, w ten sposób można uzyskać “multi-dziedziczenie”? (w przenośni, bo o faktycznym dziedziczeniu nie ma tu mowy) To może być interesujące. Ciekawe jak wtedy zachowuje się ten przykład… trzeba to przećwiczyć ;)

    Taka technika pozwala na rozszerzanie możliwości obiektów bez “zaśmiecania” ich przestrzeni nazw zbędnymi funkcjami.

    Ciekawe jaki to ma wpływ (owe zaśmiecanie) na wydajność aplikacji

Leave a Reply