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;