0

I have 3 classes

<?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;
    }
}

Second class

<?php
namespace App;

 class Book {

    private $records = [];

    public function createAddress(Address $address) {
        $this->records[] = $address;
    }

}

And third class

<?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;
    }

}

Then in index file I'm calling Book method like this:

<?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('[email protected]');

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

So what I'm tiring to do in index file - in new instance of Book I'm executing method createAddress() by wrapping it all up in anonymous function (closure function).

Than in that function I set all variables and pass it to the Book. But somehow I can not call Class in closure function as argument -

Fatal error: Uncaught TypeError: Argument 1 passed to App\Book::createAddress() must be an instance of App\Address, instance of Closure given

So I definitely am missing something fundamental here, can somebody guide me through?

5
  • Guide through what? Commented Nov 12, 2019 at 12:27
  • Why it is not accepting Address Class as anonymous function argument? Commented Nov 12, 2019 at 12:28
  • 1
    createAddress requires Address instance, you pass Closure. What's is unclear here? Closure is not instance of Address. Commented Nov 12, 2019 at 12:28
  • 1
    Either make your createAddress() not require an Address object as parameter or don't use a closure but create a new Address() object and pass that as parameter Commented Nov 12, 2019 at 12:31
  • Yes that's it, Thanks, @kerbholz that was the thing! I removed Address from createAddress() and it works Commented Nov 12, 2019 at 12:35

1 Answer 1

0
public function createAddress(Address $address) // look, it wants an address!

You try and pass a closure, which the class didn't ask for. So ditch the closure.

$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);
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.