【问题标题】:If is needed only sometimes, should I always return something?如果只是有时需要,我应该总是返回一些东西吗?
【发布时间】:2013-12-31 04:42:20
【问题描述】:

我有以下场景:一个类,其方法在数组中存储键值并返回 void。
方法是这样的:

<?php
abstract class MyClass
{
    // ...

    protected function setAttribute($name, $value, $skipCasting = null)
    {
        // ...

        $this->attributes[$name] =& $value;
    }

    // ...
}

现在,我在我的应用程序中多次使用此方法,其中 50% 的时间我只是设置属性,另外 50% 的时间我还需要返回我设置的值。

我想知道,就性能而言,如果我总是返回 something 会导致(显着)内存丢失

【问题讨论】:

标签: php oop memory memory-leaks


【解决方案1】:

现在,我在我的应用程序中多次使用此方法,其中 50% 的时间我只是设置属性,另外 50% 的时间我还需要返回我设置的值。

在这种情况下,您可能需要两个不同的方法,一个 setter 和一个 getter,例如:-

abstract class MyClass
{
    // ...

    protected function setAttribute($name, $value, $skipCasting = null)
    {
        // ...

        $this->attributes[$name] =& $value;
    }

    public function getAttribute($name)
    {
         return $this->attributes[$name];
    }
}

这样你就可以根据需要调用适用的函数了。

我想知道,就性能而言,如果我总是返回一些东西,会导致(严重的)记忆丧失吗?

不,不用担心,如果您不需要使用任何方法或函数的返回值,您可以完全放心地忽略它们。

【讨论】:

  • 谢谢@vascowhite,实际上我已经有了一个吸气剂。关键是避免调用另一种方法。如果setAttribute() 已经返回一个值,则可以这样做!
  • 在这种情况下,请忽略我回答的前半部分 :)
  • @Jessica OP 的代码有一些味道,但我不想通过进入它们来混淆答案。这就是其中之一。
  • @Jessica 该方法还用于通过 __get() 魔术方法存储值,以便在应用程序的其他时间更快地检索它们。然而,重点不在于为什么我必须做某事……而是这样做是否会导致记忆丧失!!
  • 老实说,听起来你把注意力集中在错误的事情上。
【解决方案2】:

如果很大程度上依赖于解释器,但在大多数语言中,函数的返回值只是一个压入堆栈的值,然后由调用者弹出。

在像PHP这样的高级语言中,它有自己的内存管理器和垃圾收集器,担心这些事情有点过分,但如果你真的担心的话,那么将值存储在变量中,调用函数并在之后使用它可能更安全。

【讨论】:

    【解决方案3】:

    您主要关心内存分配/性能吗? PHP 进行自己的垃圾收集,通常作为单一线性进程执行,因此没有真正考虑内存分配等。

    对内存分配不感兴趣并不是最佳实践,但在单线程、单一进程中,它不如在基于多线程 .net 的服务中重要。

    编辑:如果您非常关心内存管理并且此脚本执行了很长时间,请查看

    http://www.php.net/manual/en/features.gc.php

    它展示了如何在长时间运行的脚本中进行一些垃圾收集。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 2020-10-14
      • 1970-01-01
      • 2010-10-01
      • 2012-02-20
      相关资源
      最近更新 更多