You can't without implementing it yourself in similar way than in your example.
PHP support for covariance and contravariance is clearly defined:
Covariance allows a child's method to return a more specific type than the return type of its parent's method. Whereas, contravariance allows a parameter type to be less specific in a child method, than that of its parent.
If a child class were capable of having stricter parameter requirements than its parent or interface, this would lead to broken expectations.
For example: let's say that you have the following:
abstract class AbstractParam{}
class ParamOne extends AbstractParam{}
class ParamTwo extends AbstractParam{}
class ParamThree extends AbstractParam{}
abstract class AbstractService {
abstract public function foo(AbstractParam $bar);
}
Any time you would need to use an implementation of this service, you would do so with the assurance that passing any valid instance ofAbstractParam
tofoo()
would be legal. The method signature is clearly communicating this.
If I could change this on inheritance/implementation, and suddenly I could changefoo()
signature to:
public function foo(ParamOne $bar)
The contract would be broken, and you couldn't depend onAbstractService
safely, since there would be no longer possible to pass anyAbstractParam
instance tofoo()
, thus violating the LSP in the process: You could no longer substitute objects of the base class with objects that belong to a subtype of that base object while maintaining correctness.
The approach in your question would work, but I don't think it's a great design for the above reasons. If you really must go that way, simply remove the type hint from method definition:
abstract class AbstractService {
abstract public function foo($bar);
}
class ConcreteService extends AbstractService {
public function foo($bar) {}
}
But it's probably better to rethink why you actually need this, and try to retain type-safety.
Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.
Find the answer in similar questions on our website.
Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.
PHP (from the English Hypertext Preprocessor - hypertext preprocessor) is a scripting programming language for developing web applications. Supported by most hosting providers, it is one of the most popular tools for creating dynamic websites.
The PHP scripting language has gained wide popularity due to its processing speed, simplicity, cross-platform, functionality and distribution of source codes under its own license.
https://www.php.net/
Welcome to the Q&A site for web developers. Here you can ask a question about the problem you are facing and get answers from other experts. We have created a user-friendly interface so that you can quickly and free of charge ask a question about a web programming problem. We also invite other experts to join our community and help other members who ask questions. In addition, you can use our search for questions with a solution.
Ask about the real problem you are facing. Describe in detail what you are doing and what you want to achieve.
Our goal is to create a strong community in which everyone will support each other. If you find a question and know the answer to it, help others with your knowledge.