Wzorzec Strategy - PHP nie widzi metody z interfejsu

0

Hej,
zacząłem przerabiać wzorce projektowe, zawarte w tej książce(którą zresztą długo odkładałem):
http://helion.pl/ksiazki/prog[...]php-5-hasin-hayder,probph.htm
Pierszy jest wzorzec Strategia, dlatego też od niego zacząłem. W książce jest opisane to dość zawile a i w tak krótkim kawałku kodu w książce autor popełnia literówki a może i nawet błędy. Wiem, książka jest dość stara ale lubię książki a innej nie mam :)

Do rzeczy. Na screenach prezentuję kody z książki:

1.png
2.png
3.png

Nieco go poprawiłem, oto on:

plik: interface.Notifier.php

<?php
interface Notifier {
    public function notify();
}

plik: class.EmailNotifier.php

<?php
include_once 'interface.Notifier.php';

/**
* class.EmailNotifier.php 
*/
class EmailNotifier implements Notifier
{
    public function notify() {
        return 'E-mail';
    }
}

plik: class.SMSNotifier.php

<?php
include_once 'interface.Notifier.php';

/**
* class.SMSNotifier.php 
*/
class SMSNotifier implements Notifier
{
    public function notify() {
        return 'SMS';
    }
}

class.FaxNotifier.php

<?php
include_once 'interface.Notifier.php';

/**
* class.SMSNotifier.php 
*/
class SMSNotifier implements Notifier
{
    public function notify() {
        return 'SMS';
    }
}

plik: index.php

<?php

include_once 'class.EmailNotifier.php';
include_once 'class.FaxNotifier.php';
include_once 'class.SMSNotifier.php';

/**
* Kod tworzy atrapę obiektu User, który z założenia posiada metodę o nazwie
* getNotifier(). Wartością zwrotną tej metody będzie "sms" lub "fax" lub "email".
*/

class User
{
    const NOTIFY = 'sms';

    public function getNotifier() {
        return self::NOTIFY;
    }
    public function select() {
        switch (self::NOTIFY) {
            case 'email':
                $objNotifier = new EmailNotifier;
                break;
            case 'sms';
                $objNotifier = new SMSNotifier;
                break;
            case 'fax';
                $objNotifier = new FaxNotifier;
                break;
        }
    }
}
$user = new User;
$notifier = $user->getNotifier();
$notifier = $user->select();

$objNotifier->notify();

Idąc tym tropem błąd pojawia się przy ostatniej linijce:

$objNotifier->notify();

Jest to "odniesienie" do interfejsu a przynajmniej tak z tej ksiązki to rozumiem. Tak na prawdę to nie wiem po co tam jest to użyte ale skoro autor tam wstawił to znaczy, że miał coś na myśli. Zatem skoro jest to obiekt interfejsu norifier to wydaje mi się, że powinien zostać utworzony, bo przecież nie mogę chyba utworzyć za pomocą new nowego obiektu.

notice oraz error:

Notice: Undefined variable: objNotifier in /opt/lampp/htdocs/projekty/BitBucket/learn-oop/4/strategy/index.php on line 38

Fatal error: Uncaught Error: Call to a member function notify() on null in /opt/lampp/htdocs/projekty/BitBucket/learn-oop/4/strategy/index.php:38 Stack trace: #0 {main} thrown in /opt/lampp/htdocs/projekty/BitBucket/learn-oop/4/strategy/index.php on line 38

Dziwi mnie też, że autor używa switch`a poza klasą i tak jakoś w ogóle z czterech liter ten kod. Jakieś rady?
Co prawda bardzo fajnie jest ten wzorzec wysłumaczony tutaj:
http://lukasz-socha.pl/php/wzorce-projektowe-cz-2-strategy/

lecz bardziej interesuje mnie kontekst tego co autor książki miał na myśli.

0

Przecież komunikaty są jasne, widzę że przepisałes kod z książki do klasy User i zrobiłeś to źle. Przecież tego objNotifiera nigdzie nie zwracasz (klasa user), a potem odwołujesz się do nie istniejącej zmiennej.

0

jak znasz podstawy to zawalcz z jakimś frameworkiem sobie, z tegorocznymi przykładami z netu ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0