在接口中使用标量类型抽象类

时间:2019-01-24 11:15:30

标签: php interface abstract-class

我正在尝试处理标量类型和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

与上述相同,但问题是应用于抽象类。

0 个答案:

没有答案