Даны три класса - необходимо получить render
PHPВыделить код
/*
Book record: #1
Address: 33 Market street, London, Greater London, EC4 MB5, GB
Contact #1: <john@doe.com> John Doe
Contact #2: <anna@baker.com> Anna Baker
Book record: #2
Address: 22 Tower Street, SK4 1HV, GB
Contact #1: <dane@rovens.com> Ms Dane Rovens
*/
Получаю ошибку
Fatal error: Uncaught TypeError: Argument 1 passed to Book::createAddress() must be an instance of Address, instance of Closure given, called in
Классы менять можно, а index.php нельзя.
Не понимаю как решить?
В моем понятии при создании обьекта Book в методе __onconstruct необходимо создать экземпляр класса Address, но класс Book задекларирован раньше, и class Book extends Address не работает.
Этот созданный экземпляр класса Address использовать в анонимной функции createAddress(Address $address), но как его туда передать не могу понять. Подскажите пожалуйста.
index.php
PHP:
скопировать код в буфер обмена
<?PHP require_once dirname(__FILE__).'/book.php'; require_once dirname(__FILE__).'/address.php'; require_once dirname(__FILE__).'/contact.php'; # Create first contact $contact = new Contact; $contact->setName('Mr John Doe'); $contact->setEmail('john@doe.com'); # Add first contact to list of contacts $contacts[] = $contact; # Create second contact $contact = new Contact; $contact->setName('Ms Anna Baker')->setEmail('anna@baker.com'); # Add second contact to list of contacts $contacts[] = $contact; // # Open new book $book = new Book; //var_dump($book); # Add first address with both contacts $book->createAddress(function(Address $address) use ($contacts){ $address->setHouseNumber('33'); $address->setStreet('Market street')->setCity('London'); $address->setPostCode('EC4 MB5'); $address->setCounty('Greater London'); $address->setCountry('GB'); foreach($contacts as $contact){ $address->addContact($contact); } }); # Reset contact list $contacts = []; # Create first contact $contact = new Contact; $contact->setName('Ms Dane Rovens'); $contact->setEmail('dane@rovens.com'); # Add first contact to list of contacts $contacts[] = $contact; # Add second address with one contact $book->createAddress(function(Address $address) use ($contacts) { $address->setHouseNumber('22'); $address->setStreet('Tower street'); $address->setPostCode('SK4 1HV'); $address->setCountry('GB'); foreach($contacts as $contact){ $address->addContact($contact); } }) # Output all of the known information ->render(); # preview of expected output below /** Book record: #1 Address: 33 Market street, London, Greater London, EC4 MB5, GB Contact #1: <john@doe.com> John Doe Contact #2: <anna@baker.com> Anna Baker Book record: #2 Address: 22 Tower Street, SK4 1HV, GB Contact #1: <dane@rovens.com> Ms Dane Rovens **/ address.php
PHP:
скопировать код в буфер обмена
<?PHP class Address{ private $houseNumber = ''; private $street = ''; protected $city = ''; protected $county = ''; public $postcode = ''; public $country = ''; private $contacts = []; public function __construct($houseNumber = '', $street = '', $city = '', $county = '', $postcode = '', $country = '', $contacts = []) { $this->contacts[] = $contacts; $this->houseNumber = $houseNumber; $this->street = $street; $this->city = $city; $this->county = $county; $this->postcode = $postcode; $this->country = $country; } public function addContact($contactValue){ $this->contacts[] = $contactValue; } // public function createAddress(Address $address){ // $this->records[] = $address; // } public function setHouseNumber($houseNumberValue){ $this->houseNumber = $houseNumberValue; } public function setStreet($streetValue){ $this->street = $streetValue; return $this; } public function setCity($cityValue){ $this->city = $cityValue; } public function setPostCode($postcodeValue){ $this->postcode = $postcodeValue; } public function setCounty($countyValue){ $this->county = $countyValue; } public function setCountry($countryValue){ $this->country = $countryValue; } }
contact.php
PHP:
скопировать код в буфер обмена
<?PHP class Contact { private $name = ''; public $email = ''; public function __construct($name = '',$email = '') { $this->name = $name; $this->email = $email; } public function setName($name){ $this->name = $name; return $this; } public function setEmail($email) { $this->email = $email; } public function getName() { $shortName = $name; return $shortName; } public function getEmail() { return $this->email; } }
book.php
PHP:
скопировать код в буфер обмена
<?PHP class Book{ private $records = []; public function __construct (array $records = []) { $this->records[] = $records; $this->createClass(); } public function createClass(){ $address = new Address(); return $address; } public function createAddress(Address $address){ $this->records[] = $address; } // public function getIterator() { // //yield from $this->records; // return new ArrayIterator($this); // } public function render(){ $output = []; foreach($this->records as $index => $record){ $output[] = 'Book record #'.($index+1); $output[] = $record['address']->getHouseNumber(); foreach($record['contacts'] as $index => $contact){ $output[] = 'Contact #'.($index+1).': <'.$contact->getEmail().'> '.$contact->getName(); } } } }
|