Hej,
zacząłem przerabiać wzorce projektowe, zawarte w tej książce(którą zresztą długo odkładałem):
http://helion.pl/ksiazki/programowanie-obiektowe-w-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:
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.