在PHP中挂钩函数调用

Sør*_*ard 5 php reflection hook introspection

一点背景:在运行时,我希望能够检查当前调用的函数javadoc样式文档,以确定其正式(类型)声明.这将允许在调试和测试期间通过反射(代价)检查运行时类型(对于简单和复杂类型),我会发现非常有用的东西.

所以,在php中我想要在任何其他函数即将被调用时调用用户定义的函数.也就是说,如果函数foo()被调用,我想在之前调用我的callHookHandler()函数.

一种解决方案是在所有用户定义的类中实现__call(),但这既笨拙又不包括对类外定义的函数的支持,所以我正在寻找更好的解决方案.

And*_*oso 5

这听起来有点有趣,所以我会试着回答它.

我希望这可以帮助你.让我知道事情的后续.

那么,你要问的是什么,这是如何:

对于功能:

  1. 获取所有已定义的函数$function = get_defined_functions().
  2. 循环通过$functions['user']键并与ReflectionFunction班级一起检查每一个.你需要得到:
    1. 评论使用 ->getDocComment()
    2. 使用的论据 ->getParameters()
  3. 做一些魔术(我会让你弄清楚如何使用一些常规的弹出来解析注释,并将其与反射中的参数列表进行匹配.不要忘记可选参数!)
  4. 使用重命名功能 runkit_function_rename
  5. 在字符串中生成代码,该字符串检查参数并调用重命名的函数
  6. 生成参数列表作为字符串
  7. runkit_function_add使用在步骤#5中生成的代码和步骤#6中的参数列表创建新函数.

对于类:

  1. 获取课程列表 $classes = get_declared_classes();
  2. 循环遍历每个并检查它ReflectionObject->getMethods()获得方法.确保该类不在内部,->isInternal()因为我们无法对内部类做任何事情.
  3. 在内循环中...使用ReflectionMethod类遍历每个方法.像使用普通函数一样获取参数和PHPDoc/JavaDoc注释.
  4. 你没有与功能只能使用同样的事情runkit_method_addrunkit_method_rename代替.

缺点:

您将无法检查内部类方法和函数(这很好,因为它们无论如何都不会有文档注释).

这是很多工作!我留下了很多想象力的部分,以避免这是一本短篇小说.

请把这个或开源发给我,让我知道你完成后,我真的想自己用它.联系信息在我的网站上,在我的个人资料中;)

或者:

您可以使用XDebug的函数跟踪以及反射,然后在事后分析结果,这样您就不必动态编辑代码.如果你想编写单元测试,你甚至可以自动化它.

希望类型检查使其成为PHP的未来版本并等待:https://wiki.php.net/rfc/typechecking

笔记:

这个类引用有一个可能有用的例子,在页面的评论部分解析docComments:http://us.php.net/manual/en/class.reflectionmethod.php

参考