【问题标题】:Add Class in closure function argument PHP - Uncaught TypeError thrown在闭包函数参数 PHP 中添加类 - 抛出未捕获的 TypeError
【发布时间】: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


【解决方案1】:
public function createAddress(Address $address) // look, it wants an address!

您尝试传递一个闭包,但该类没有要求。所以放弃关闭。

$address = new Address();
$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($address);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 2021-11-02
    相关资源
    最近更新 更多