<?php
interface OriginalContract
{
}
interface MoreSpecificContract extends OriginalContract
{
}
interface BazInterface
{
public function baz(OriginalContract $item);
}
class Foo implements BazInterface
{
public function baz(OriginalContract $item) {}
}
class Bar implements BazInterface
{
public function baz(MoreSpecificContract $item) {}
}
/*
I actually want Bar to accept only instances of MoreSpecificContract
Since it extends OriginalContract, it should be valid imho
The only way I can now do this is
class Bar extends Foo
{
public function baz(OriginalContract $item)
{
if (($item instanceof MoreSpecificContract) === false) {
throw new Exception("Expected something more specific");
}
// do some more specific stuff
}
}
*/
Fatal error: Declaration of Bar::baz(MoreSpecificContract $item) must be compatible with BazInterface::baz(OriginalContract $item) in /in/7gAPj on line 23
Process exited with code 255.
Output for 8.3.5
Warning: PHP Startup: Unable to load dynamic library 'sodium.so' (tried: /usr/lib/php/8.3.5/modules/sodium.so (libsodium.so.23: cannot open shared object file: No such file or directory), /usr/lib/php/8.3.5/modules/sodium.so.so (/usr/lib/php/8.3.5/modules/sodium.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
Fatal error: Declaration of Bar::baz(MoreSpecificContract $item) must be compatible with BazInterface::baz(OriginalContract $item) in /in/7gAPj on line 23
Process exited with code 255.
Fatal error: Declaration of Bar::baz(MoreSpecificContract $item) must be compatible with BazInterface::baz(OriginalContract $item) in /in/7gAPj on line 21
Process exited with code 255.
Fatal error: Declaration of Bar::baz() must be compatible with BazInterface::baz(OriginalContract $item) in /in/7gAPj on line 22
Process exited with code 255.