Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP: "Declaration of ... should be compatible with that of ..."

Tags:

php

symfony

I'd like to create an interface for entities that are CRUDable (can be saved and deleted). Here is my abstract class:

abstract class AbstractCrudableEntity extends AbstractEntity
{
    abstract public function doSave();
    abstract public function doDelete();
}

My implementing class needs a couple extra parameters to those methods. Here is the signature of the implementing class:

class Contact extends AbstractCrudableEntity {
    public function doSave(User $user, \UberClientManager $manager);
    public function doDelete(User $user, \UberClientManager $manager);
}

I understand that PHP requires that implementing classes have the same parameters for the methods as the parent class (there are several questions that answer this question: this, for example). So that is not the problem.

However, I recently came across some code in Symfony dealing with authentication tokens. The class UsernamePasswordToken extends AbstractToken, and has a different set of parameters in the __construct() method: AbstractToken::__construct() versus UsernamePasswordToken::__construct().

My question is how is Symfony able to do this? What is the difference between this and my code?

like image 633
theunraveler Avatar asked Feb 19 '23 15:02

theunraveler


1 Answers

Overriding constructors is a special case:

Unlike with other methods, PHP will not generate an E_STRICT level error message when __construct() is overridden with different parameters than the parent __construct() method has.

You can not do that with other methods.

like image 106
Elnur Abdurrakhimov Avatar answered Feb 27 '23 10:02

Elnur Abdurrakhimov