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

时间:2009-12-27 10:42:56

标签: php

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

我怎么能确定这一点?调用此方法的代码属于框架,所以我可以使用settype($returnVal, 'string')做一些奇特的东西,如果这有帮助的话?有更好的解决方案吗?

4 个答案:

答案 0 :(得分:10)

在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的实例,因此将抛出异常。

答案 1 :(得分:7)

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

class MyClass
{
    public function getData(): MyData
    {
        return 1234; //TypeError!
    }
}
class MyData
{
}

这样,以下代码无效并抛出TypeError

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

Sandbox

答案 2 :(得分:4)

我能想到的唯一方法是在父类中创建一个调用代码将使用的public final方法,以及protected方法,该方法将由{{1}调用} 方法。 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! 是一种公共方法,如果您不知道,则无法覆盖。另请注意,这只适用于PHP 5.0.0或更高版本。

答案 3 :(得分:1)

据我所知,没有办法在PHP中实现返回值的类型提示。从PHP 5开始,function parameters的提示有限。

但是,即使有,你要做的不是类型暗示的工作。如果我返回的字符串为空,会发生什么?无论调用方法的哪个位置,都需要检查返回值,并做出适当的反应。