我已经定义了一个抽象类和一个应该返回模板文件名的方法.用户对此抽象类进行子类化,并实现该方法以返回模板文件名.但问题是,如果用户没有返回任何内容,则不会发出警告或其他任何事情.
我怎么能确定这一点?调用此方法的代码属于框架,所以我可以做一些奇特的东西settype($returnVal, 'string'),如果这有帮助吗?有更好的解决方案吗?
Pas*_*TIN 10
在PHP中,你不能"强制"一个方法返回任何东西 - 即使使用抽象类/方法,也不可能使用接口.
您可以做的最好的事情是表明实现应该返回一些内容,使用注释 - 但您不能强迫人们这样做:
/**
* @param string $a blah blah
* @return int The return value blah blah
*/
public function my_method($a);
Run Code Online (Sandbox Code Playgroud)
当然,如果您从框架中调用此方法(实现),您可以检查返回的内容,如果它与您预期的内容不符,则抛出异常...
这是一个如何实现的简单示例:
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 !");
}
Run Code Online (Sandbox Code Playgroud)
这里,由于该方法不返回实例ClassB,因此将抛出异常.
在PHP 7中,可以强制方法返回类的实例,如下所示:
class MyClass
{
public function getData(): MyData
{
return 1234; //TypeError!
}
}
class MyData
{
}
Run Code Online (Sandbox Code Playgroud)
这样,以下代码无效并抛出TypeError:
$obj = new MyClass();
$obj->getData();
Run Code Online (Sandbox Code Playgroud)
沙盒.