在PHP中伪造方法属性?
在 PHP中可以使用等效的.NET方法属性,还是以某种方式模拟这些? 上下文 我们有一个我们喜欢的内部URL路由类.它今天工作的方式是,我们首先必须使用中央路由管理员注册所有的路由,如下所示: $oRouteManager->RegisterRoute('admin/test/',array('CAdmin','SomeMethod')); $oRouteManager->RegisterRoute('admin/foo/','SomeOtherMethod')); $oRouteManager->RegisterRoute('test/',array('CTest','SomeMethod')); 每当遇到路由时,调用回调方法(在上述情况下都是静态类方法).但是,这样做将路由与方法分开,至少在代码中. 我正在寻找一些方法来使路线更接近方法,你可以在C#中完成: <Route Path="admin/test/"> public static void SomeMethod() { /* implementation */ } 我现在看到的选项是要创建一些phpDoc扩展,让我能够这样: /** * @route admin/test/ */ public static function SomeMethod() { /* implementation */ } 但是,这将需要编写/重用phpDoc的解析器,并且很可能会相当缓慢. 另一个选择是将每个路由分成自己的类,并具有如下所示的方法: class CAdminTest extends CRoute { public static function Invoke() { /* implementation */ } public static function GetRoute() { return "admin/test/"; } } 然而,这仍然需要注册每个单一的类,并且将有大量的类(不用说额外的代码量). 那么这里有什么选择?什么是最好的方式来保持路由接近于它调用的方法? 这就是我最终解决这个问题. article provided by Kevin是一个巨大的帮助.通过使用ReflectionClass和ReflectionMethod :: getDocComment,我可以轻松地浏览phpDoc注释.一个小的正则表达式找到任何@route,并注册到该方法.反思不是那么快(在我们的情况下,在一个单独的函数中对于RegiserRoute进行硬编码调用的速度是慢2.5倍),而且由于我们有很多路由,所以我们不得不将完成的路由列表缓存Memcached,所以在每一页的加载上都不需要反射.总的来说,我们最终在缓存时平均花了7ms将路由注册为1,7ms(平均每个页面的反射使用了18ms). 如果需要手动注册,可以在子类中覆盖的代码如下所示: public static function RegisterRoutes() { $sClass = get_called_class(); // unavailable in PHP < 5.3.0 $rflClass = new ReflectionClass($sClass); foreach ($rflClass->getMethods() as $rflMethod) { $sComment = $rflMethod->getDocComment(); if (preg_match_all('%^s**s*@routes+(?P<route>/?(?:[a-z0-9]+/?)+)s*$%im',$sComment,$result,PREG_PATTERN_ORDER)) { foreach ($result[1] as $sRoute) { $sMethod = $rflMethod->GetName(); $oRouteManager->RegisterRoute($sRoute,array($sClass,$sMethod)); } } } } 感谢大家指出我正确的方向,这里有很多好的建议!我们采用这种方法,只是因为它允许我们保持路由接近它调用的代码: class CSomeRoutable extends CRoutable { /** * @route /foo/bar * @route /for/baz */ public static function SomeRoute($SomeUnsafeParameter) { // this is accessible through two different routes echo (int)$SomeUnsafeParameter; } } (编辑:莱芜站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |