我制作了自己的php mini-framework,我的index.php看起来像这样
<?php
$imagesDir = 'images/';
$images = glob($imagesDir . '*.{jpg,jpeg,png,gif}', GLOB_BRACE);
$randomImage = $images[array_rand($images)];
echo "<img src='$randomImage'>";
?>
然而,有些人告诉我制作<?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
因为已经创建了类实例会更好,而且我不知道为什么,我的路由器没有运行任何功能,只有匹配URI的那个,所以我不认为它会成为一个问题。我已经测试了两种方式,但我没有看到任何差异。
由于我是高中生和其中一位告诉我这是大学老师的人,我认为他可能是对的,但我没有看到内存使用方面的任何差异。
根据@ smuuf的回答,我想说<?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();
不是一个合适的类,而不是在index.php中的每个函数内编写10或20行代码,调用其他类如{ {1}},processor
,view
等等,我使用完全相同的静态方法创建了users
类,orm
类没有这样做。在处理请求时使用任何自己的方法或属性。
我刚更新了我的路由器,并且我还更新了代码,看起来与我的index.php完全一样,但我仍然在寻找同一问题的答案。
答案 0 :(得分:2)
简短回答: 没关系。
更长的答案:如果不必要地创建该实例,那么传递一个实例就没有任何内容更好。请参阅这一切归结为processor
真正做的事情。
如果processor
确实是某些复杂处理组件,需要在对其方法的调用之间保持一些内部状态,或者共享某些资源(例如,数据库连接) ,那么是的,那是一个&#34;正确的类&#34; ,绝对应该被实例化。
如果您的processor
实际上只是&#34;相关(或无关)功能的集合&#34; ,其中(例如)每个方法处理应用程序中的不同URL (如您的示例中),和实例不需要处理某些内部状态,和它的方法不会共享任何资源(例如数据库连接),真的无需为此创建实例。
事实上,如果我写了这样的&#34; helper / function集合类&#34;,我会通过以下两种方式明确地限制实例化:
__construct
方法指定为private
或abstract class
。最终,这更多地是关于如何组织代码。 内存使用差异为 - 在这种情况下 - 可忽略不计。
在我看来(严格来说):使用静态方法确实需要更少的内存并且会稍快一些,因为在调用其方法之前,没有人需要处理实例化类。但是,在现实世界的应用程序中,这种性能差异在99%的情况下都不会引起注意。