PHP中的浮动方法属性?

问题描述 投票:12回答:6

是否有可能在PHP中使用等效的.NET方法属性,或以某种方式模拟这些属性?

Context

我们非常喜欢内部URL路由类。今天的工作方式是,我们首先必须向中央路线管理器注册所有路线,如下所示:

$oRouteManager->RegisterRoute('admin/test/', array('CAdmin', 'SomeMethod'));
$oRouteManager->RegisterRoute('admin/foo/', array('CAdmin', '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/"; }
}

但是,这仍然需要注册每个类,并且会有很多这样的类(更不用说额外的代码了。)]

那么我在这里有什么选择?使路由保持接近其调用方法的最佳方法是什么?

是否有可能在PHP中为.NET方法属性使用等效项,或者以某种方式模拟这些属性?上下文我们有一个非常喜欢的内部URL路由类。今天的工作方式是...

php attributes methods url-routing decorator
6个回答
10
投票

这就是我最终解决这个问题的方式。 article provided by Kevin是一个巨大的帮助。通过使用ReflectionClass和ReflectionMethod :: getDocComment,我可以非常轻松地浏览phpDoc注释。一个小的正则表达式可以找到任何@route,并注册到该方法中。


5
投票

使用PHP 5.3,您可以使用closures


2
投票

这里是一种可能适合您的方法。每个包含路由的类都必须实现一个接口,然后在所有实现该接口的已定义类中循环以收集路由列表。接口包含单个方法,该方法期望返回UrlRoute对象的数组。然后使用您现有的URL路由类进行注册。


1
投票

我将使用接口和单例类的组合来动态注册路由。


1
投票

您可以最靠近函数定义(IMHO)的路径就在类定义之前。所以你有


0
投票

有一个建议,但被拒绝。在此处查看RFC:Attributes RFC at php.net我对这种愿望的解决方案是这样的:

© www.soinside.com 2019 - 2024. All rights reserved.