Php 我可以强制抽象类的方法返回一些东西吗?

Php 我可以强制抽象类的方法返回一些东西吗?,php,Php,我已经定义了一个抽象类和一个方法,它应该返回模板文件的名称。用户对这个抽象类进行子类化,并实现该方法以返回模板文件名。但问题是,如果用户不返回任何内容,就不会出现警告或其他任何情况 我怎么能确定呢?调用此方法的代码属于框架,因此我可以使用settype($returnVal,'string')做一些有趣的事情,如果这样有帮助的话?有更好的解决方案吗?在PHP中,您不能“强制”一个方法返回任何东西——而且这是不可能的,即使使用抽象类/方法,也不可能使用接口 您所能做的最好的事情是使用注释指示实现应

我已经定义了一个抽象类和一个方法,它应该返回模板文件的名称。用户对这个抽象类进行子类化,并实现该方法以返回模板文件名。但问题是,如果用户不返回任何内容,就不会出现警告或其他任何情况

我怎么能确定呢?调用此方法的代码属于框架,因此我可以使用
settype($returnVal,'string')
做一些有趣的事情,如果这样有帮助的话?有更好的解决方案吗?

在PHP中,您不能“强制”一个方法返回任何东西——而且这是不可能的,即使使用抽象类/方法,也不可能使用接口

您所能做的最好的事情是使用注释指示实现应该返回某些内容,但您不能强迫人们这样做:

/**
 * @param string $a blah blah
 * @return int The return value blah blah
 */
public function my_method($a);
当然,如果您从框架中调用此方法(实现),您可以检查返回的内容,如果与您期望的内容不一致,则抛出异常


下面是一个如何实现的快速示例:

class ClassA {
    /**
     * @param string $a blah blah
     * @return ClassB The return value blah blah
     */
    public function my_method($a) {
        echo 'blah';
    }
}

class ClassB {
    // ...
}


$a = new ClassA();
$returned = $a->my_method(10);
if (!$returned instanceof ClassB) {
    throw new Exception("Should have returned an instance of ClassB !");
}

在这里,由于该方法不返回
ClassB的实例,将抛出异常。

据我所知,在PHP中无法实现返回值的类型提示。自PHP5以来,对它的暗示是有限的


但即使有,你所要做的并不是一项暗示打字的工作。如果返回的字符串为空,会发生什么情况?无论在哪里调用该方法,都需要检查返回值,并做出适当的反应

我能想到的唯一方法是在调用代码将使用的父类中创建一个
public final
方法,以及一个
protected
方法,该方法将由
public final
方法调用。
protected
方法包含功能,而
public final
方法验证
protected
方法的返回值

class A {

    public final call_this($param) {

        $return_value = $this->extend_this($param);

        // validate $return_value
        if( $return_value == '' )
            throw new Exception("uh-oh! Don't return an empty string!");

        return $return_value;

    }

    protected extend_this($param) {

        // default behavior

        return $whatever;

    }

}

class B extends A {

    protected extend_this($param) {

        // new behavior

        return ''; //whoops!

    }

}

$b = new B;
$b->call_this("testing testing 123");
//exception!
但是,对于扩展类的人来说,这可能会有点让人困惑,如果您尝试这样的方法,请确保它有很好的文档记录


public final
是一个不能被重写的公共方法,以防您不知道。还请注意,这只适用于PHP 5.0.0或更高版本。

在PHP 7中,可以强制方法返回如下类的实例:

class MyClass
{
    public function getData(): MyData
    {
        return 1234; //TypeError!
    }
}
class MyData
{
}
这样,以下代码无效并抛出
TypeError

$obj = new MyClass();
$obj->getData();

.

但是可以检查返回值,对吗?@openfrog:当然可以,但你必须自己编写代码:这不是PHP强制执行的(我在你发表评论时编辑了我的答案,我将用一个例子再次编辑),这很好。谢谢你几乎同时回答了我的两个问题:-)@openfrog:是的,当我看到你关于检测对象是否是类实例的问题时,我想“嘿,我只是在另一个答案中使用了instanceof操作符”^^从php7.1开始不再正确,请参见下面的@constantin galbenu答案,这应该是可以接受的答案。它不回答关于抽象方法的问题,尽管这也可以在抽象方法中完成:抽象公共函数getData():MyData;