Я столкнулся с этим сегодня с PHP (по крайней мере, 7.1 и 7.2) со следующим кодом:
namespace PlaceHolderX\Tests\PHPUnit\Unit;
use PHPUnit\Framework\TestCase;
final class BreakingClassesTest extends TestCase
{
public function testBreak(): void
{
$tester = new SomeClassA();
$tester->test();
$this->assertNull($tester->get());
}
}
interface InterfaceA {
public function test(string $testString): void;
}
class SomeClassA implements InterfaceA
{
/** @var null|string */
private $testString;
public function test(string $testString = null): void
{
$this->testString = $testString;
}
public function get(): ?string
{
return $this->testString;
}
}
Итак, у меня есть интерфейс (InterfaceA), у которого есть метод, который требует строку,Этот аргумент не может быть пустым, потому что, если бы я хотел, я бы указал его следующим образом:
public function test(?string $testString): void;
Но в классе реализации (SomeClassA) я могу переопределить определение аргумента значением по умолчанию, равным нулю, что приводит кповедение, которое я не намеревался использовать в своем интерфейсе.
Итак, мой главный вопрос: почему это возможно?Конечно, нам нужно будет проверить это в обзорах кода, но это легко упустить.
Я попытался найти причину такого поведения, но не смог найти объяснения.Возможно, мои критерии поиска выключены.