Программа Возвращает НУЛЕВОЙ Объект

#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();