Php 如何强制调用方法
我正在创建一个API,我有一个名为Php 如何强制调用方法,php,Php,我正在创建一个API,我有一个名为Service的类,它有一个函数requireType() $type是GET、PUT、POST或DELETE final public function requireType($type){ // Do some stuff } 我还有一个名为API的主类,它创建了一个从API调用的类的实例,让我们调用ClassA,然后扩展Service class ClassA extends Service{ // Writer called "$t
Service
的类,它有一个函数requireType()
$type
是GET
、PUT
、POST
或DELETE
final public function requireType($type){
// Do some stuff
}
我还有一个名为API
的主类,它创建了一个从API
调用的类的实例,让我们调用ClassA
,然后扩展Service
class ClassA extends Service{
// Writer called "$this->requireType()" method is fine to run
public function myAction(){
// Make sure $this->requireType() was called here before anything else gets run
$this->requireType("POST");
// Do some stuff
}
// Writer did not call "$this->requireType()" method
// An error should occur
public function myAction(){
// Do some stuff
}
}
我想知道的是,在我的API
类中,我如何(如果可能)检查requireType()
是否在myAction()中立即被调用
API类方法调用如下所示(简化):
因此,最后我想要这样的东西:
来自example.com
的客户端向api发送PUT
请求。example2.com
,api。example2com
知道客户端发送了什么。被调用的方法不知道,它需要说明如果要调用我,您需要发送一个GET
请求,如果不需要,您需要发送另一个带有GET
头的请求,以便访问此方法
我主要想添加此功能,以便创建新方法的开发人员不会意外地编写接受4种头类型中任何一种的代码。我会将构造函数放在服务
类中:
class Service {
final public function __construct($type) {
$this->requireType($type);
}
}
abstract class Service {
final public function myAction($type) {
$this->requireType($type);
$this->customAction();
}
protected function customAction();
}
这样,从服务扩展的任何类都必须使用$type
构造并调用函数
或者,如果对myAction()
的每个调用都有不同的类型很重要,那么您可以在服务中有一个抽象方法和一个已定义的方法
类:
class Service {
final public function __construct($type) {
$this->requireType($type);
}
}
abstract class Service {
final public function myAction($type) {
$this->requireType($type);
$this->customAction();
}
protected function customAction();
}
这样,每个人都用他们想要的类型(由php强制)调用myAction()
,然后myAction()
调用customAction()
(必须在基本控制器构造函数的扩展类中定义),将名为“CalledRequestType”的实例变量设置为false
在requireType中,将CalledRequestType设置为true
在。。。无论您想检查它们是否调用了它(可能是调用xxAction后调用xxAction的同一个处理程序),请检查CalledRequestType并抛出异常。好吧。。。第。。什么?您能在想知道是否调用了requireType()
的那一行添加注释吗?基本上,我只想确保在扩展Service
的类中编写新公共方法的人在启动该方法时调用$this->requireType()
$type
对于每个方法都是不同的。这就是为什么要将它作为参数传递给类扩展服务。这不起作用MethodA
可能需要POST
,而MethodB
可能需要GET
如果通过构造函数,则无法为每个方法创建它。这有设计的味道问题如果他们必须在使用任何函数之前调用requireType,那么您很可能应该重新考虑您的类?您正在使用接口吗?抽象类?为什么必须调用requireType,但还不清楚他们是否必须管理它?好吧,也许这会更清楚:客户端example.com
向api发送PUT
请求。example2.com
api
知道客户端发送的方法需要说明什么,如果您要调用我您需要的话发送GET
请求,而不是PUT
请求。请再试一次。他们将编写执行检查的函数,而不是op:)在这种情况下,请将CalledRequestType放入他们正在扩展的基类中。我会更新我的答案