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

问题描述 投票:0回答:1

我已经制作了自己的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行代码,调用其他类,如viewusersorm等,我制作processor类与静态方法完全相同,processor类在处理请求时不使用任何自己的方法或属性。

更新2

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

php memory
1个回答
2
投票

简短的回答:没关系。


更长的答案:如果不必要地创建该实例,那么传递实例并没有什么好处。看,这一切归结为你的processor真正做的事情。

  1. 如果processor确实是一些复杂的处理组件,需要在调用其方法之间保持一些内部状态,或者共享一些资源(例如数据库连接),那么是的,这是一个“正确的类”,绝对应该实例化。
  2. 如果你的processor实际上只是一个“相关(或无关)函数的集合”,其中(例如)每个方法在你的应用程序中处理一个不同的URL(如你的例子),并且实例不需要处理一些内部状态,它的方法不会共享任何资源(例如数据库连接),实际上没有必要为它创建一个实例。

实际上,如果我编写了这样的“帮助器/函数集合类”,我会通过以下任一方式明确地限制实例化:

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

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


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

© www.soinside.com 2019 - 2024. All rights reserved.