当我知道我在PHP中调用什么方法时,如何获取方法名称

时间:2016-06-13 11:09:24

标签: php class methods

关键是我有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()函数?

1 个答案:

答案 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

执行

eval.in

上查看它