gpt4 book ai didi

php - PHP 中伪造方法属性?

转载 作者:行者123 更新时间:2023-12-03 00:26:08 26 4
gpt4 key购买 nike

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

上下文

我们有一个非常喜欢的内部 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/"; }
}

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

那么我有什么选择呢?保持路由接近它调用的方法的最佳方法是什么?

最佳答案

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

反射并不是那么快(在我们的例子中,大约比在单独的函数中硬编码调用 RegiserRoute 慢 2.5 倍),并且由于我们有很多路由,所以我们必须缓存完成的列表Memcached 中的路由,因此每次页面加载时都不需要反射。总的来说,我们最终从注册路由花费 7 毫秒减少到缓存时平均花费 1.7 毫秒(每个页面加载的反射平均使用 18 毫秒。

执行此操作的代码如下:如果需要手动注册,可以在子类中重写该代码:

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*@route\s+(?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;
}
}

关于php - PHP 中伪造方法属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1818533/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com