#php #design-patterns
#php #дизайн-шаблоны
Вопрос:
Я хочу продемонстрировать шаблон заводского проектирования, используя фрагмент кода PHP. Поэтому я разрабатываю этот код самостоятельно. Но это дает мне НУЛЕВОЙ объект .Пожалуйста, помогите мне решить эту проблему .
lt;?php class Book{ private $bookName; private $bookAuthor; const lineBreak = "lt;br/gt;"; public function __construct($bookName,$bookAuthor) { $this-gt;bookName = $bookName; $this-gt;bookAuthor = $bookAuthor; } public function getBookInfo(){ return $this-gt;bookName .'-'.$this-gt;bookAuthor .self::lineBreak; } } class BookFactory{ public function __construct($bookName,$bookAuthor) { $book = new Book($bookName,$bookAuthor); return $book-gt;getBookInfo(); } } $bookOne = new BookFactory("Digital World","David Perera"); $bookTwo = new BookFactory("Harry Porter","James bond"); var_dump($bookOne);
Комментарии:
1. Возвращаемое значение конструктора игнорируется.
new BookFactory()
всегда возвращаетBookFactory
объект.2. @Бармар , Спасибо . Не могли бы вы, пожалуйста, подробнее рассказать об этом ? как я мог преодолеть эту проблему?
3. Я попробовал твой код. Я не понимаю
NULL
. Я получаюobject(BookFactory)#1 (0) { }
4. @Barмар -Да, вы правы . Теперь я изменил свой код. все тот же результат
5. Вы все равно получите тот же результат. Как я уже сказал, не имеет значения, что ты вернешь.
Ответ №1:
Вы не можете реализовать заводской шаблон в конструкторе. new Classname
всегда возвращает объект этого класса, а не то, что возвращает конструктор.
Вместо этого вы должны использовать статический метод для создания объекта.
class BookFactory{ public static function createBook($bookName,$bookAuthor) { return new Book($bookName,$bookAuthor); } } $bookOne = BookFactory::createBook("Digital World","David Perera"); $bookTwo = BookFactory::createBook("Harry Porter","James bond"); var_dump($bookOne);
Комментарии:
1. Спасибо @Barmarу . у меня есть один вопрос. я новичок в php. почему мы не можем получить доступ к методу класса подобным образом . новая книга($BookName,$bookAuthor)-gt;getBookInfo() , почему нам всегда нужно создавать ссылку на объект ?
2. Из — за приоритета оператора по умолчанию вам нужны круглые скобки вокруг
new
выражения:echo (new Book("Harry Porter","James bond"))-gt;getBookInfo();