关键是我有getDates()
方法,我希望将此方法的名称作为字符串,但不要运行此方法。实际上它看起来像下一个:
$object->getResultExecutionMethod(convertmMethodNameToString($object->findDates()));
getResultExecutionMethod($methodName) {
switch($methodName) {
case convertmMethodNameToString($this->findDates()):
return $getDatesStatus;
break;
case convertmMethodNameToString($this->anotherMethodOfThisClass()):
return $anotherMethodOfThisClassStatus;
break;
}
}
在1类中我有很多方法,并且有很多变量符合这种方法的执行状态。调用convertmMethodNameToString()
并将我的方法放在那里我希望通过此方法获得执行状态。
那么我如何实现convertmMethodNameToString()
函数?
答案 0 :(得分:0)
您可以从神奇的__call
方法中受益。您可以说,如果您需要某个方法的状态,您可以调用具有相同名称的方法,但后缀为“Status”。好的一点是,你实际上不必在最后使用“状态”创建所有这些方法,但可以使用陷阱。
此外,您可以使用__FUNCTION__
获取正在运行的函数的名称。这对获取状态没有意义,但可能是设置。
以下是一些示例代码:
class myClass {
// Use an array to keep the statusses for each of the methods you have:
private $statusses = [
"findDates" => "my original status",
"anotherMethodOfThisClass" => "another original status"
];
public function findDates($arg) {
echo "Executing " . __FUNCTION__ . ".\n";
// Set execution status information:
$this->statusses[__FUNCTION__] = "last executed with argument = $arg";
}
// ... other methods come here
// Finally: magic method to trap all undefined method calls (like a proxy):
public function __call($method, $arguments) {
// Remove the Status word at the end of the method name
$baseMethod = preg_replace("/Status$/", "", $method);
// ... and see if now we have an existing method.
if(method_exists($this, $baseMethod)) {
echo "Returning execution status for $baseMethod.\n";
// Yes, so return the execution status we have in our array:
return $this->statusses[$baseMethod];
}
}
}
// Create object
$object = new myClass();
// Execute method
$object->findDates("abc");
// Get execution status for that method. This method does not really exist, but it works
$status = $object->findDatesStatus();
echo "Status: $status\n";
以上代码输出:
上查看它执行findDates。
执行
返回findDates的执行状态 状态:最后一次使用argument = abc