php注解使用示例
<div style="margin-left: 30px">今天看到php注解的介绍文章很感兴趣,动手实际试了试挺好玩,写这篇文章记录下</div><div>php从8开始支持原生注解功能了,我们可以写个小的例子看看注解怎么玩。</div>
<div> </div>
<div>先确定我们的任务目标</div>
<div style="margin-left: 30px">1、编写一个注解类route处理根据注解反射将使用注解的方法加入到路由列表</div>
<div style="margin-left: 30px">2、定义入口文件初始化项目自动完成路由列表的更新</div>
<div style="margin-left: 30px">3、根据URL请求从路由列表获取路由信息找到对应类实例化并执行对应方法</div>
<div style="margin-left: 30px"> </div>
<div>
<div>先做个约定:</div>
<div>1、约定路由格式为:http://localhost/8/index.php?c=index&a=index</div>
<div>
<div>这里c 表示控制器controller,a 表示动作 action 也就是类方法</div>
<div>
<div>2、约定目录结构</div>
<div>root</div>
<div>|---index.php</div>
<div>|---config.php</div>
<div>|---route.php</div>
<div style="margin-left: 30px">---|controller</div>
<div style="margin-left: 30px">|---index.php</div>
<div style="margin-left: 30px">|---work.php</div>
<div> </div>
<div>config.php配置文件,route.php注解路由类文件和index.php 入口文件平级</div>
<div>controller/indexController.php,controller/workController.php两个使用注解的测试控制器位于下一级目录controller中</div>
<div> </div>
<div>
<div>前期准备</div>
<div>先准备两个类用来测试</div>
<div>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> indexController
{
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"></span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> index():<span style="color: rgba(0, 0, 0, 1)">void
{
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "This is attribute index controller \r\n"<span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"></span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> test():<span style="color: rgba(0, 0, 0, 1)">void
{
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "This is attribute test controller \r\n"<span style="color: rgba(0, 0, 0, 1)">;
}
}</span></pre>
</div>
<p> </p>
</div>
<div>
<div>indexController控制器类,有两个方法index和test</div>
<div>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> workController
{
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"></span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> work():<span style="color: rgba(0, 0, 0, 1)">void
{
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "This is attribute work controller \r\n"<span style="color: rgba(0, 0, 0, 1)">;
}
}</span></pre>
</div>
<p> </p>
</div>
<div>
<div>workController控制器类,有一个方法work</div>
<div> </div>
<div>
<div>前期工作完成,开始实际编写注解路由类</div>
<div>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"></span>
<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> route{
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(128, 0, 128, 1)">$all</span> =<span style="color: rgba(0, 0, 0, 1)"> [];
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(128, 0, 128, 1)">$path</span> = ''<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(128, 0, 128, 1)">$method</span> = 'GET'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(128, 0, 128, 1)">$function</span> = ''<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(128, 0, 128, 1)">$controller</span> = ''<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> __construct(){}
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> setPath(<span style="color: rgba(0, 0, 255, 1)">string</span> <span style="color: rgba(128, 0, 128, 1)">$path</span>):<span style="color: rgba(0, 0, 0, 1)">self
{
</span><span style="color: rgba(128, 0, 128, 1)">$this</span>->path = <span style="color: rgba(128, 0, 128, 1)">$path</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span><span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> setMethod(<span style="color: rgba(0, 0, 255, 1)">string</span> <span style="color: rgba(128, 0, 128, 1)">$method</span>):<span style="color: rgba(0, 0, 0, 1)">self
{
</span><span style="color: rgba(128, 0, 128, 1)">$this</span>->method = <span style="color: rgba(128, 0, 128, 1)">$method</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span><span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> setFunction(<span style="color: rgba(0, 0, 255, 1)">string</span> <span style="color: rgba(128, 0, 128, 1)">$function</span>):<span style="color: rgba(0, 0, 0, 1)">self
{
</span><span style="color: rgba(128, 0, 128, 1)">$this</span>-><span style="color: rgba(0, 0, 255, 1)">function</span> = <span style="color: rgba(128, 0, 128, 1)">$function</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span><span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> setController(<span style="color: rgba(0, 0, 255, 1)">string</span> <span style="color: rgba(128, 0, 128, 1)">$controller</span>):<span style="color: rgba(0, 0, 0, 1)">self
{
</span><span style="color: rgba(128, 0, 128, 1)">$this</span>->controller = <span style="color: rgba(128, 0, 128, 1)">$controller</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span><span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> addRoute():<span style="color: rgba(0, 0, 0, 1)">void
{
self</span>::<span style="color: rgba(128, 0, 128, 1)">$all</span>[<span style="color: rgba(0, 128, 128, 1)">str_replace</span>("Controller","",<span style="color: rgba(128, 0, 128, 1)">$this</span>->controller)][<span style="color: rgba(128, 0, 128, 1)">$this</span>-><span style="color: rgba(0, 0, 255, 1)">function</span>] = <span style="color: rgba(128, 0, 128, 1)">$this</span><span style="color: rgba(0, 0, 0, 1)">;
}</span></pre>
</div>
<div> </div>
<div>先定义路由的相关类属性,这里不考虑访问范围问题都用public修饰符</div>
<div>在这个类中定义了设置path、method、function、controller属性的方法,返回值用$this表示可以链式调用</div>
<div>addRoute() 方法将当前对应按 [‘控制器’][‘方法’] 的二维数组存起来备用</div>
<div>这里要说明下#</div>
<div>这就是注解的定义,有这个表示这个类是注解类Attribute是注解关键词,后面小括号里的是注解属性配置</div>
<div>IS_REPEATABLE 表示这个注解可以重复使用</div>
<div>TARGET_METHOD 表示这个注解只能用来修饰类内的方法</div>
<div> </div>
<div>注意:这里定义的TARGET_METHOD在php语法检查时不会进行验证,即用这个注解修饰属性或类代码也不会报错,但执行会抛出异常</div>
</div>
<div>
<p> </p>
<div>有了注解类我们就可以开始实际使用了</div>
<div>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">function</span> setRoute(<span style="color: rgba(128, 0, 128, 1)">$controllerClass</span><span style="color: rgba(0, 0, 0, 1)">){
</span>
<span style="color: rgba(128, 0, 128, 1)">$ref</span> = <span style="color: rgba(0, 0, 255, 1)">new</span> ReflectionClass(<span style="color: rgba(128, 0, 128, 1)">$controllerClass</span><span style="color: rgba(0, 0, 0, 1)">);</span>
<span style="color: rgba(128, 0, 128, 1)">$controller</span> = <span style="color: rgba(128, 0, 128, 1)">$ref</span>-><span style="color: rgba(0, 0, 0, 1)">getName();
</span><span style="color: rgba(128, 0, 128, 1)">$methods</span> = <span style="color: rgba(128, 0, 128, 1)">$ref</span>-><span style="color: rgba(0, 0, 0, 1)">getMethods();
</span><span style="color: rgba(0, 0, 255, 1)">foreach</span>(<span style="color: rgba(128, 0, 128, 1)">$methods</span> <span style="color: rgba(0, 0, 255, 1)">as</span> <span style="color: rgba(128, 0, 128, 1)">$method</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(128, 0, 128, 1)">$function</span> = <span style="color: rgba(128, 0, 128, 1)">$method</span>-><span style="color: rgba(0, 0, 0, 1)">getName();
</span><span style="color: rgba(128, 0, 128, 1)">$attributes</span> = <span style="color: rgba(128, 0, 128, 1)">$method</span>->getAttributes(route::<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);
</span>
<span style="color: rgba(0, 0, 255, 1)">foreach</span>(<span style="color: rgba(128, 0, 128, 1)">$attributes</span> <span style="color: rgba(0, 0, 255, 1)">as</span> <span style="color: rgba(128, 0, 128, 1)">$attribute</span><span style="color: rgba(0, 0, 0, 1)">){
</span>
<span style="color: rgba(128, 0, 128, 1)">$route</span> = <span style="color: rgba(128, 0, 128, 1)">$attribute</span>-><span style="color: rgba(0, 0, 0, 1)">newInstance();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 拿到注解上的参数</span>
<span style="color: rgba(128, 0, 128, 1)">$params</span> = <span style="color: rgba(128, 0, 128, 1)">$attribute</span>-><span style="color: rgba(0, 0, 0, 1)">getArguments();
</span><span style="color: rgba(128, 0, 128, 1)">$route</span>->setController(<span style="color: rgba(128, 0, 128, 1)">$controller</span><span style="color: rgba(0, 0, 0, 1)">)
</span>->setFunction(<span style="color: rgba(128, 0, 128, 1)">$function</span><span style="color: rgba(0, 0, 0, 1)">)
</span>->setPath(<span style="color: rgba(128, 0, 128, 1)">$params</span>)
</span>->setMethod(<span style="color: rgba(128, 0, 128, 1)">$params</span>)
</span>-><span style="color: rgba(0, 0, 0, 1)">addRoute();
}
}
}
}</span></pre>
</div>
<div>在route类定义新的方法,根据注解反射路由列表setRoute()方法接收一个被route注解修饰的类作为参数。</div>
<div>通过反射获取控制器名称,方法列表将其调用route一系列方法设置属性并加入路由列表</div>
<div> </div>
<div>
<div>现在我们可以使用注解生成路由列表了</div>
<div>
<div>indexController类的两个方法都使用route注解进行修饰,并指定path和method两个参数</div>
<div>此时我们打印route::$all路由列表</div>
<div><img src="https://img2022.cnblogs.com/blog/2028339/202211/2028339-20221104173310906-1606702108.png">
<p> </p>
<p> </p>
<div>可以看到当前的路由列表确实是按照['控制器']['方法']的二维数组组装起来了,并且保存了每个路由的对象</div>
<div>到这里核心的使用注解生成路由列表其实已结束了,但如果不能看看效果谁知道你是不是胡说的呢?因此下面我们完善这个例子实现通过localhost/8/index.php?c=index&a=index格式的URL访问对应控制器的功能</div>
<div> </div>
<div>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> app{
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> appInit():<span style="color: rgba(0, 0, 0, 1)">self
{
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 128, 128, 1)">glob</span>("./controller/*.php"<span style="color: rgba(0, 0, 0, 1)">)){
</span><span style="color: rgba(0, 0, 255, 1)">foreach</span>(<span style="color: rgba(0, 128, 128, 1)">glob</span>("./controller/*.php") <span style="color: rgba(0, 0, 255, 1)">as</span> <span style="color: rgba(128, 0, 128, 1)">$fileName</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 0, 255, 1)">require_once</span>(<span style="color: rgba(128, 0, 128, 1)">$fileName</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$className</span> = <span style="color: rgba(0, 128, 128, 1)">str_replace</span>("./controller/","",<span style="color: rgba(0, 128, 128, 1)">str_replace</span>(".php","",<span style="color: rgba(128, 0, 128, 1)">$fileName</span><span style="color: rgba(0, 0, 0, 1)">));
route</span>::setRoute(<span style="color: rgba(128, 0, 128, 1)">$className</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">route::$all;exit();</span>
<span style="color: rgba(0, 0, 0, 1)"> }
}
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span><span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> run(<span style="color: rgba(128, 0, 128, 1)">$config</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(128, 0, 128, 1)">$controller</span> = <span style="color: rgba(128, 0, 128, 1)">$_GET</span>['c']??<span style="color: rgba(128, 0, 128, 1)">$config</span>['default_controller'<span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(128, 0, 128, 1)">$action</span> = <span style="color: rgba(128, 0, 128, 1)">$_GET</span>['a']??<span style="color: rgba(128, 0, 128, 1)">$config</span>['default_function'<span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 0, 255, 1)">isset</span>(route::<span style="color: rgba(128, 0, 128, 1)">$all</span>[<span style="color: rgba(128, 0, 128, 1)">$controller</span>][<span style="color: rgba(128, 0, 128, 1)">$action</span><span style="color: rgba(0, 0, 0, 1)">])){
</span><span style="color: rgba(128, 0, 128, 1)">$route</span> = route::<span style="color: rgba(128, 0, 128, 1)">$all</span>[<span style="color: rgba(128, 0, 128, 1)">$controller</span>][<span style="color: rgba(128, 0, 128, 1)">$action</span><span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(128, 0, 128, 1)">$className</span> = <span style="color: rgba(128, 0, 128, 1)">$route</span>-><span style="color: rgba(0, 0, 0, 1)">controller;
</span><span style="color: rgba(128, 0, 128, 1)">$function</span> = <span style="color: rgba(128, 0, 128, 1)">$route</span>-><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">;
(</span><span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(128, 0, 128, 1)">$className</span>)-><span style="color: rgba(128, 0, 128, 1)">$function</span><span style="color: rgba(0, 0, 0, 1)">();
}</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 0, 255, 1)">exit</span>("404 Not Found!"<span style="color: rgba(0, 0, 0, 1)">);
}
}
}</span></pre>
</div>
<div>这里我们定义一个app类作为项目的基本对象当前类中定义了两个方法</div>
<div>appInit()初始化项目并返回类对象</div>
<div>run() 根据对应的配置运行指定的路由和操作</div>
<div>为方便处理我这里直接遍历了controller目录,在实际的项目中应该使用自动加载机制按需加载</div>
<div>初始化时将controller目录下的全部控制器方法调用route类加入到路由列表</div>
<div> </div>
<div>到这里我们只剩最后一步了,将请求过来的URL解析,找到controller 和 action 然后执行方法</div>
<div>这一步我们交给run()方法执行,</div>
<div>run()方法接收$_GET参数 c 和 a 分别对应 控制器和动作</div>
<div>判断如果路由列表中有对应的控制器和方法则将类实例化,调用对应方法,如果路由列表中没有这个对应路由则返回404错误。</div>
<div>需要指出的是这里404并不一定是没有这个对应方法,也有可能是有方法但没有使用route注解修饰导致反射找不到这个方法。</div>
<div><img src="https://img2022.cnblogs.com/blog/2028339/202211/2028339-20221104173441380-1671492500.png">
<p> </p>
<p> </p>
<div>有此控制器和动作执行对应类对应方法</div>
<div><img src="https://img2022.cnblogs.com/blog/2028339/202211/2028339-20221104173501057-1345524826.png">
<p> </p>
<p> </p>
<div>没有这个动作或控制器返回404</div>
<div>最后为了健壮性我们增加一个默认的控制器和默认动作,如果URL中没有传任何控制器和动作参数则走默认动作,将这个配置提取到配置文件中</div>
<div>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(128, 0, 128, 1)">$config</span> = <span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">(
</span>'default_controller'=>'index',
'default_function'=>'index',<span style="color: rgba(0, 0, 0, 1)">
);
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$config</span>;</pre>
</div>
<div>这样如果什么都不传我们的代码会默认访问index控制器下的index方法</div>
<div><img src="https://img2022.cnblogs.com/blog/2028339/202211/2028339-20221104173600446-432302361.png">
<p> </p>
<p> </p>
<div>贴上完整代码:</div>
<div>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"></span>
<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> route{
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(128, 0, 128, 1)">$all</span> =<span style="color: rgba(0, 0, 0, 1)"> [];
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(128, 0, 128, 1)">$path</span> = ''<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(128, 0, 128, 1)">$method</span> = 'GET'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(128, 0, 128, 1)">$function</span> = ''<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(128, 0, 128, 1)">$controller</span> = ''<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> __construct(){}
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> setPath(<span style="color: rgba(0, 0, 255, 1)">string</span> <span style="color: rgba(128, 0, 128, 1)">$path</span>):<span style="color: rgba(0, 0, 0, 1)">self
{
</span><span style="color: rgba(128, 0, 128, 1)">$this</span>->path = <span style="color: rgba(128, 0, 128, 1)">$path</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span><span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> setMethod(<span style="color: rgba(0, 0, 255, 1)">string</span> <span style="color: rgba(128, 0, 128, 1)">$method</span>):<span style="color: rgba(0, 0, 0, 1)">self
{
</span><span style="color: rgba(128, 0, 128, 1)">$this</span>->method = <span style="color: rgba(128, 0, 128, 1)">$method</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span><span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> setFunction(<span style="color: rgba(0, 0, 255, 1)">string</span> <span style="color: rgba(128, 0, 128, 1)">$function</span>):<span style="color: rgba(0, 0, 0, 1)">self
{
</span><span style="color: rgba(128, 0, 128, 1)">$this</span>-><span style="color: rgba(0, 0, 255, 1)">function</span> = <span style="color: rgba(128, 0, 128, 1)">$function</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span><span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> setController(<span style="color: rgba(0, 0, 255, 1)">string</span> <span style="color: rgba(128, 0, 128, 1)">$controller</span>):<span style="color: rgba(0, 0, 0, 1)">self
{
</span><span style="color: rgba(128, 0, 128, 1)">$this</span>->controller = <span style="color: rgba(128, 0, 128, 1)">$controller</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span><span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> addRoute():<span style="color: rgba(0, 0, 0, 1)">void
{
self</span>::<span style="color: rgba(128, 0, 128, 1)">$all</span>[<span style="color: rgba(0, 128, 128, 1)">str_replace</span>("Controller","",<span style="color: rgba(128, 0, 128, 1)">$this</span>->controller)][<span style="color: rgba(128, 0, 128, 1)">$this</span>-><span style="color: rgba(0, 0, 255, 1)">function</span>] = <span style="color: rgba(128, 0, 128, 1)">$this</span><span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">function</span> setRoute(<span style="color: rgba(128, 0, 128, 1)">$controllerClass</span><span style="color: rgba(0, 0, 0, 1)">){
</span>
<span style="color: rgba(128, 0, 128, 1)">$ref</span> = <span style="color: rgba(0, 0, 255, 1)">new</span> ReflectionClass(<span style="color: rgba(128, 0, 128, 1)">$controllerClass</span><span style="color: rgba(0, 0, 0, 1)">);</span>
<span style="color: rgba(128, 0, 128, 1)">$controller</span> = <span style="color: rgba(128, 0, 128, 1)">$ref</span>-><span style="color: rgba(0, 0, 0, 1)">getName();
</span><span style="color: rgba(128, 0, 128, 1)">$methods</span> = <span style="color: rgba(128, 0, 128, 1)">$ref</span>-><span style="color: rgba(0, 0, 0, 1)">getMethods();
</span><span style="color: rgba(0, 0, 255, 1)">foreach</span>(<span style="color: rgba(128, 0, 128, 1)">$methods</span> <span style="color: rgba(0, 0, 255, 1)">as</span> <span style="color: rgba(128, 0, 128, 1)">$method</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(128, 0, 128, 1)">$function</span> = <span style="color: rgba(128, 0, 128, 1)">$method</span>-><span style="color: rgba(0, 0, 0, 1)">getName();
</span><span style="color: rgba(128, 0, 128, 1)">$attributes</span> = <span style="color: rgba(128, 0, 128, 1)">$method</span>->getAttributes(route::<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);
</span>
<span style="color: rgba(0, 0, 255, 1)">foreach</span>(<span style="color: rgba(128, 0, 128, 1)">$attributes</span> <span style="color: rgba(0, 0, 255, 1)">as</span> <span style="color: rgba(128, 0, 128, 1)">$attribute</span><span style="color: rgba(0, 0, 0, 1)">){
</span>
<span style="color: rgba(128, 0, 128, 1)">$route</span> = <span style="color: rgba(128, 0, 128, 1)">$attribute</span>-><span style="color: rgba(0, 0, 0, 1)">newInstance();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 拿到注解上的参数</span>
<span style="color: rgba(128, 0, 128, 1)">$params</span> = <span style="color: rgba(128, 0, 128, 1)">$attribute</span>-><span style="color: rgba(0, 0, 0, 1)">getArguments();
</span><span style="color: rgba(128, 0, 128, 1)">$route</span>->setController(<span style="color: rgba(128, 0, 128, 1)">$controller</span><span style="color: rgba(0, 0, 0, 1)">)
</span>->setFunction(<span style="color: rgba(128, 0, 128, 1)">$function</span><span style="color: rgba(0, 0, 0, 1)">)
</span>->setPath(<span style="color: rgba(128, 0, 128, 1)">$params</span>)
</span>->setMethod(<span style="color: rgba(128, 0, 128, 1)">$params</span>)
</span>-><span style="color: rgba(0, 0, 0, 1)">addRoute();
}
}
}
}</span></pre>
</div>
<div>route.php</div>
<div> </div>
<div>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> app{
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> appInit():<span style="color: rgba(0, 0, 0, 1)">self
{
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 128, 128, 1)">glob</span>("./controller/*.php"<span style="color: rgba(0, 0, 0, 1)">)){
</span><span style="color: rgba(0, 0, 255, 1)">foreach</span>(<span style="color: rgba(0, 128, 128, 1)">glob</span>("./controller/*.php") <span style="color: rgba(0, 0, 255, 1)">as</span> <span style="color: rgba(128, 0, 128, 1)">$fileName</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 0, 255, 1)">require_once</span>(<span style="color: rgba(128, 0, 128, 1)">$fileName</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$className</span> = <span style="color: rgba(0, 128, 128, 1)">str_replace</span>("./controller/","",<span style="color: rgba(0, 128, 128, 1)">str_replace</span>(".php","",<span style="color: rgba(128, 0, 128, 1)">$fileName</span><span style="color: rgba(0, 0, 0, 1)">));
route</span>::setRoute(<span style="color: rgba(128, 0, 128, 1)">$className</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">route::$all;exit();</span>
<span style="color: rgba(0, 0, 0, 1)"> }
}
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span><span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> run(<span style="color: rgba(128, 0, 128, 1)">$config</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(128, 0, 128, 1)">$controller</span> = <span style="color: rgba(128, 0, 128, 1)">$_GET</span>['c']??<span style="color: rgba(128, 0, 128, 1)">$config</span>['default_controller'<span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(128, 0, 128, 1)">$action</span> = <span style="color: rgba(128, 0, 128, 1)">$_GET</span>['a']??<span style="color: rgba(128, 0, 128, 1)">$config</span>['default_function'<span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 0, 255, 1)">isset</span>(route::<span style="color: rgba(128, 0, 128, 1)">$all</span>[<span style="color: rgba(128, 0, 128, 1)">$controller</span>][<span style="color: rgba(128, 0, 128, 1)">$action</span><span style="color: rgba(0, 0, 0, 1)">])){
</span><span style="color: rgba(128, 0, 128, 1)">$route</span> = route::<span style="color: rgba(128, 0, 128, 1)">$all</span>[<span style="color: rgba(128, 0, 128, 1)">$controller</span>][<span style="color: rgba(128, 0, 128, 1)">$action</span><span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(128, 0, 128, 1)">$className</span> = <span style="color: rgba(128, 0, 128, 1)">$route</span>-><span style="color: rgba(0, 0, 0, 1)">controller;
</span><span style="color: rgba(128, 0, 128, 1)">$function</span> = <span style="color: rgba(128, 0, 128, 1)">$route</span>-><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">;
(</span><span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(128, 0, 128, 1)">$className</span>)-><span style="color: rgba(128, 0, 128, 1)">$function</span><span style="color: rgba(0, 0, 0, 1)">();
}</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 0, 255, 1)">exit</span>("404 Not Found!"<span style="color: rgba(0, 0, 0, 1)">);
}
}
}</span></pre>
</div>
<div>init.php</div>
<div> </div>
<div>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> indexController
{
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"></span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> index():<span style="color: rgba(0, 0, 0, 1)">void
{
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "This is attribute index controller \r\n"<span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"></span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> test():<span style="color: rgba(0, 0, 0, 1)">void
{
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "This is attribute test controller \r\n"<span style="color: rgba(0, 0, 0, 1)">;
}
}</span></pre>
</div>
<div>indexController.php</div>
<div> </div>
<div>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> workController
{
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"></span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> work():<span style="color: rgba(0, 0, 0, 1)">void
{
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "This is attribute work controller \r\n"<span style="color: rgba(0, 0, 0, 1)">;
}
}</span></pre>
</div>
<div>workController.php</div>
<div> </div>
<div>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(128, 0, 128, 1)">$config</span> = <span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">(
</span>'default_controller'=>'index',
'default_function'=>'index',<span style="color: rgba(0, 0, 0, 1)">
);
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$config</span>;</pre>
</div>
<div>config.php</div>
<div> </div>
<div>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 0, 255, 1)">require_once</span>('./config.php'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">require_once</span>('./route.php'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">require_once</span>('./init.php'<span style="color: rgba(0, 0, 0, 1)">);
(</span><span style="color: rgba(0, 0, 255, 1)">new</span> app)->appInit()->run(<span style="color: rgba(128, 0, 128, 1)">$config</span>);</pre>
</div>
<div>index.php</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div><br><br>
来源:https://www.cnblogs.com/python-gulp-php/p/16858596.html
頁:
[1]