【发布时间】:2020-03-08 03:51:17
【问题描述】:
我有 3 节课
<?php
namespace App;
class Address {
private $houseNumber = '';
private $street = '';
protected $city = '';
protected $county = '';
public $postcode = '';
public $country = '';
private $contacts = [];
public function setHouseNumber($provided_housenumber){
$this->houseNumber = $provided_housenumber;
return $this;
}
public function setStreet($provided_street){
$this->street = $provided_street;
return $this;
}
public function setPostCode($provided_postcode){
$this->postcode = $provided_postcode;
return $this;
}
public function setCounty($provided_county){
$this->county = $provided_county;
return $this;
}
public function setCountry($provided_country){
$this->country = $provided_country;
return $this;
}
}
二等
<?php
namespace App;
class Book {
private $records = [];
public function createAddress(Address $address) {
$this->records[] = $address;
}
}
三等舱
<?php
namespace App;
class Contact {
private $name = '';
public $email = '';
public function setName($provided_name){
$this->name = $provided_name;
return $this;
}
public function setEmail($provided_mail){
$this->email = $provided_mail;
return $this;
}
}
然后在索引文件中我这样调用 Book 方法:
<?php
require_once __DIR__ . '/vendor/autoload.php';
use App\Contact;
use App\Book;
use App\Address;
# 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;
# Open new book
$book = new Book;
# Add first address with both contacts
$book->createAddress(function(Address $address) use ($contacts){ //<---- Here it throws Fatal error: Uncaught TypeError: Argument 1 passed to App\Book::createAddress() must be an instance of App\Address, instance of Closure given
$address->setHouseNumber('33');
$address->setStreet('Example street')->setCity('Cambridge');
$address->setPostCode('CBF MB5');
$address->setCounty('Cambridgeshire');
$address->setCountry('GB');
foreach($contacts as $contact){
$address->addContact($contact);
}
});
所以我厌倦了在索引文件中做的事情 - 在 Book 的新实例中,我通过将其全部包装在匿名函数(闭包函数)中来执行方法 createAddress()。
在那个函数中,我设置了所有变量并将其传递给 Book。但不知何故,我不能在闭包函数中调用 Class 作为参数 -
致命错误:未捕获的类型错误:参数 1 传递给 App\Book::createAddress() 必须是 App\Address 的实例,instance 给定的闭包
所以我肯定在这里遗漏了一些基本的东西,有人可以指导我吗?
【问题讨论】:
-
指导什么?
-
为什么不接受地址类作为匿名函数参数?
-
createAddress需要Address实例,您通过Closure。这里不清楚是什么?Closure不是Address的实例。 -
要么让您的
createAddress()不 需要Address对象作为参数,或者不使用闭包而是创建new Address()对象并将其作为参数传递 -
是的,就是这样,谢谢,@kerbholz 就是这样!我从 createAddress() 中删除了地址,它可以工作
标签: php oop error-handling closures