静态与实例方法中的内存使用情况

时间:2018-01-20 20:13:35

标签: php memory

我制作了自己的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}},processorview等等,我使用完全相同的静态方法创建了users类,orm类没有这样做。在处理请求时使用任何自己的方法或属性。

更新2

我刚更新了我的路由器,并且我还更新了代码,看起来与我的index.php完全一样,但我仍然在寻找同一问题的答案。

1 个答案:

答案 0 :(得分:2)

简短回答: 没关系。

更长的答案:如果不必要地创建该实例,那么传递一个实例就没有任何内容更好。请参阅这一切归结为processor真正做的事情

  1. 如果processor确实是某些复杂处理组件,需要在对其方法的调用之间保持一些内部状态,或者共享某些资源(例如,数据库连接) ,那么是的,那是一个&#34;正确的类&#34; ,绝对应该被实例化。

  2. 如果您的processor实际上只是&#34;相关(或无关)功能的集合&#34; ,其中(例如)每个方法处理应用程序中的不同URL (如您的示例中)实例不需要处理某些内部状态,它的方法不会共享任何资源(例如数据库连接),真的无需为此创建实例

  3. 事实上,如果我写了这样的&#34; helper / function集合类&#34;,我会通过以下两种方式明确地限制实例化:

    • __construct方法指定为private
    • 将整个班级定义为abstract class

    最终,这更多地是关于如何组织代码。 内存使用差异为 - 在这种情况下 - 可忽略不计。

    在我看来(严格来说):使用静态方法确实需要更少的内存并且会稍快一些,因为在调用其方法之前,没有人需要处理实例化类。但是,在现实世界的应用程序中,这种性能差异在99%的情况下都不会引起注意。