PHP扩展类与传递对象作为参数 - 性能问题

时间:2011-09-11 17:21:10

标签: php performance

我需要构建一个用于生成(并提交,验证等)Web表单的类。我还有一个通过编写PHP代码生成原始HTML的类。

现在,在设计构建Web表单的类时,我需要许多与HTML生成器相关的活动,换句话说,我需要HTML生成器类完成的一些功能。我可以通过两种方式实现这一目标:

  1. 使表单类扩展 HTMl类:class WebForm extends HTML {}
  2. 我已经为我的项目中的其他目的创建了一个HTML类的对象(let,$html)。我可以在WebForm类的构造函数中将其作为参数传递:

    class WebForm{
    
        public $html;
    
        public function __construct($html) {
            $this->html = $html;
        }
    }
    
    $html = new HTML(); //  already created for some other purpose
    $webform = new WebForm($html);
    
  3. 哪种方法更快&为什么吗

4 个答案:

答案 0 :(得分:0)

除非您对HTML方法进行数百万次调用,否则几乎肯定会产生微不足道的差异。

如果我不得不猜测(这真的只是猜测),那么我会说选项#1可能会更快(而且可以忽略不计)。理由是调用HTML方法需要一个较少的间接级别。但确认这一理论的唯一方法是轮流分析每个选项。

另请注意,您应该首先设计您的类,然后是性能第二(只有在您确认它是一个问题之后)。例如,您应该问自己WebForm扩展HTML是否有意义;说Webform HTML是否有意义?

答案 1 :(得分:0)

扩展方法更快,因为您只需实例化单个对象。但是,如果您只在页面中执行一次,则无法衡量。

为了可维护性,撰写方法更好。

顺便说一句,您应该认真考虑将所有HTML生成代码移动到模板引擎。只需从您的表单类中呈现模板,并仅处理PHP中的验证,而不是HTML生成,或者您最终将在控制器中执行与视图相关的任务。

答案 2 :(得分:0)

用C语言来说,一个指针解引用操作的继承方法比聚合方法(需要额外的$this->html解除引用)更快。在PHP中,它应具有可比性。

但是,一个指针取消引用的成本几乎可以忽略不计你不应该将你的架构建立在这种纯粹的理论差异上,因为它永远不值得。即使您已经每秒服务数百个请求并且需要额外的性能,这也不是可行的方法。这是一个经典案例,其中聚合优先于继承。

最后,请考虑使Html类仅使用static方法。这是完全合理的,因为它是一个辅助类,所以它不需要维持任何状态。如果由于某种原因您觉得它需要某种状态,请让调用者维护它并将其作为函数参数传递给Html。这不仅可以改善您的设计,还可以删除我们上面讨论的额外指针取消引用。作为进一步的奖励,它将完全否定实例化Html实例的开销,即使您需要在单个请求的生命周期内实例化多个WebForm对象(您认为这两种方法都有这个缺点)

答案 3 :(得分:0)

老实说,在编写应用程序(或原型)并开始分析之前,你永远无法得到有根据的答案,否则你将根据假设得到答案。

您应该考虑更多,然后只考虑速度来构建您的应用程序。解耦,维护,可测试性和一切相关。速度可能是微不足道的,你选择一个而不是另一个,但那时你将被困在一个维护地狱。

我建议您实施这两种方法并亲眼看看。有一些工具可以帮助进行分析(例如xdebug)。