Использование скалярных типов в интерфейсах |Абстрактные классы - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь справиться со скалярными типами и подсказками типов в 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

То же, что и выше, но вместо этого применяется вопрос к абстрактным классам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...