所以我现在正在编写一个PHP类,以帮助简化SQL语句的构建。我正在编写它们,以便每个方法都返回一个对象的实例(return $this
),以便启用方法链接。
是否可以测试被调用的方法是否是方法链的一部分以及方法链中已经执行了哪些方法?例如,在下面的代码中,我希望'来自'测试是否在其前面使用select()
方法将其作为链的一部分进行调用的方法。
$object->select('john', 'chris')->from('people');
提前致谢!
答案 0 :(得分:1)
我认为没有必要检查被调用方法的顺序。您可以创建一个finally方法(例如execute()
),并在其中检查查询所需的所有属性,如果缺少任何属性(例如select
),您可以为其设置默认值:if可用(例如'select' => '*'
)。
但是在任何情况下,如果你想要检查在具体方法之前调用的某个方法,你可以设置private
属性来保持方法要求。例如:
private $_methodsRequirements = array(
'from' => array('select'),
'set' => array('update', 'where'),
// and all requiriments for each method
)
private $_calledMethods = array();
并创建用于检查方法“callability”的其他方法:
private function checkCallability($method) {
$requiredMethods = $this->_methodsRequirements[$method];
foreach($requiredMethods as $m) {
if(!in_array($m, $this->_calledMethods)) {
throw new Exception('You must call method "'.$m.'" before calling method "'.$method.'"!');
}
}
return true;
}
并且在每个方法的开头都必须调用它:
public function select() {
$this->checkCallability(__METHOD__);
// your query generation
array_push($this->_calledMethods, __METHOD__);
}