Я пытаюсь справиться со скалярными типами и подсказками типов в PHP. Более конкретно, я пытаюсь создать несколько примеров интерфейсов, чтобы попытаться узнать, как я могу использовать интерфейсы в своих проектах, и посмотреть, смогу ли я создать несколько действительно полезных шаблонов классов как таковых.
Насколько я понимаю, интерфейс определяет методы без определения того, что они делают. Предоставление разработчикам гибкости для создания нескольких классов, основанных на одном и том же принципе, но выполняемых по-разному (например, создание интерфейса базы данных и наличие классов PDOHandler и MysqliHandler.
Для меня я понял, что это означает, что вы можете набирать параметры подсказок без необходимости делать это внутри каждого класса.
Я настроил эксперимент для проверки этого и использовал следующий код:
<?php
#commenting this out allows ->init(4) to work with foobar
declare(strict_types = 1);
interface Foo
{
public function init(?string $str);
}
class Bar implements Foo
{
public function init($str)
{
return gettype($str);
}
}
class FooBar implements Foo
{
public function init(?string $str)
{
return gettype($str);
}
}
$bar = new \Bar();
$foobar = new \FooBar();
echo $bar->init('4'). "\r\n";
echo $bar->init(4);
echo '<br />';
echo '=========================================================================';
echo '<br />';
echo $foobar->init('4');
echo $foobar->init(4); # this errors as expected
В идеале я хотел бы установить скалярный тип в интерфейсе, чтобы уменьшить количество повторений в моих классах, которые реализуют интерфейс. Есть ли способ, которым я могу сделать это? Или я должен явно объявить скалярные типы во всех классах?
Редактировать: Абстрактные классы
Код моего абстрактного класса:
<?php
declare(strict_types = 1);
abstract class FooBar
{
abstract public function test(?string $str);
}
class Trey extends FooBar
{
public function test($str)
{
return gettype($str);
}
}
$trey = new \Trey();
echo $trey->test(4); = this works, when I'd expect it to fatal error
То же, что и выше, но вместо этого применяется вопрос к абстрактным классам.