我已经制作了自己的php迷你框架,我的index.php看起来像这样
<?php
require __DIR__.'/../app/autoloader.php';
Autoloader::register();
use Stories\http\routing\{RouteCollection,Matcher,Route};
use Stories\http\Request;
use Stories\App\Stories;
$app = new Stories();
$routes = new RouteCollection();
$home = new Route('/',function(Request $request) use ($app) {
return \Stories\Processor::home($request,$app);
}, ['method' => 'GET']);
$routes->add("home",$home);
...
$login = new Route('/login', function (Request $request) use ($app) {
return \Stories\Processor::login($request,$app);
}, ['method' => 'GET']);
$routes->add('login',$login);
$matcher = new Matcher($routes);
$matcher->find()->run();
但是,有些人告诉我制作\my\namespace\processor
的实例并将其传递给函数,如下所示:
<?php
require __DIR__.'/../app/autoloader.php';
Autoloader::register();
use Stories\http\routing\{RouteCollection,Matcher,Route};
use Stories\http\Request;
use Stories\App\Stories;
use Stories\Processor;
$app = new Stories();
$routes = new RouteCollection();
$processor = new Processor();
$home = new Route('/',function(Request $request) use ($app,$processor) {
return $processor->home($request,$app);
}, ['method' => 'GET']);
$routes->add("home",$home);
...
$login = new Route('/login', function (Request $request) use ($app,$processor) {
return $processor->login($request,$app);
}, ['method' => 'GET']);
$routes->add('login',$login);
$matcher = new Matcher($routes);
$matcher->find()->run();
因为已经创建了类实例会更好,我不知道为什么,我的路由器不运行任何功能,只运行匹配URI的那个,所以我认为这不会是一个问题。我已经测试了两种方式,但我没有看到任何差异。
由于我是一名高中生,而且其中一位告诉我这是大学老师的人我认为他可能是对的,但我没有看到内存使用方面的任何差异。
基于@ smuuf的回答,我想说processor
不是一个合适的类,而不是在index.php中的每个函数内编写10或20行代码,调用其他类,如view
,users
,orm
等,我制作processor
类与静态方法完全相同,processor
类在处理请求时不使用任何自己的方法或属性。
我刚刚更新了我的路由器,我还更新了代码,看起来与我的index.php完全一样,但我仍然在寻找相同问题的答案。
简短的回答:没关系。
更长的答案:如果不必要地创建该实例,那么传递实例并没有什么好处。看,这一切归结为你的processor
真正做的事情。
processor
确实是一些复杂的处理组件,需要在调用其方法之间保持一些内部状态,或者共享一些资源(例如数据库连接),那么是的,这是一个“正确的类”,绝对应该实例化。processor
实际上只是一个“相关(或无关)函数的集合”,其中(例如)每个方法在你的应用程序中处理一个不同的URL(如你的例子),并且实例不需要处理一些内部状态,它的方法不会共享任何资源(例如数据库连接),实际上没有必要为它创建一个实例。实际上,如果我编写了这样的“帮助器/函数集合类”,我会通过以下任一方式明确地限制实例化:
__construct
方法指定为private
,或abstract class
。最终,这更多地是关于如何组织代码。在这种情况下,内存使用差异可以忽略不计。
在我看来(严格来说):使用静态方法确实需要更少的内存并且会稍快一些,因为在调用它的方法之前没有人需要处理实例化类。然而,在现实世界的应用程序的99%的情况下,这种性能差异是不明显的。