【问题标题】:How to redesign this PHP code without local variable?如何在没有局部变量的情况下重新设计这个 PHP 代码?
【发布时间】:2011-08-12 00:50:06
【问题描述】:

我有这样的功能:

function get_title($keyword) {

    $titles = array(
        'p1'   => 'Title 1',
        'p2'   => 'Title 2',
        // ... other data
        'pm'   => 'Some other title',
        'pn'   => 'One more title'
    );

    return $titles[$keyword];
}

将这样的数组保存在局部变量中是一种好习惯吗?例如,它有大约 50 个标题。所以每次我调用这个函数 - 脚本都会加载 50 个标题?

我正在考虑使用global,但全局不是一个不好的做法吗?

我是 PHP 新手,早期我用 JS 编写过。在 JS 中,我可以使用闭包来做到这一点:

var get_title = function() {

    var titles = {
        'p1': 'Title 1',
        'p2': 'Title 2',
        // ... other data
        'pm': 'Some other title',
        'pn': 'One more title'
    }

    return function(keyword) {
        return titles[keyword];
    }
}();

这里,title-array 不是全局的,每次调用函数时它都不会加载。 但是如何在 PHP 中做到这一点呢?

【问题讨论】:

标签: php javascript closures local-variables


【解决方案1】:

要么:

$titles = array(
    'p1'   => 'Title 1',
    'p2'   => 'Title 2',
     // ... other data
    'pm'   => 'Some other title',
    'pn'   => 'One more title'
);

function get_title($keyword) {
    global $titles;
    return $titles[$keyword];
}
get_title('p1');

class Something {
    private static $titles = array(
        'p1'   => 'Title 1',
        'p2'   => 'Title 2',
         // ... other data
        'pm'   => 'Some other title',
        'pn'   => 'One more title'
    );

    public static function get_title($keyword) {
        return self::$titles[$keyword];
    }
}
Something::get_title('p1');

这里使用静态类有点像 Javascript 中的闭包。

除非内存有问题,否则不要担心。

【讨论】:

    【解决方案2】:

    $titles 是否来自数据库?如果不是,这真的是微优化,我几乎可以说实例化该变量永远不会成为值得优化的瓶颈。

    但是,如果您真的需要,有两个简单的解决方案。第一个确实是保留一个全局变量。一个问题是任何人都可以修改您的全局数组。除此之外,这还不错。

    另一种解决方案是创建一个以$titles 作为私有静态成员的静态类。那么只需要创建一个调用这个数组的公共方法即可。

    这些解决方案只会将您的数组实例化一次。

    编辑:啊,Frits 正好说明了我的意思。

    【讨论】:

      【解决方案3】:

      听起来全局适合这里。

      尽量不要关注那些说“某某总是'邪恶'”的人。正如您现在发现的那样,这样的概括是危险的。

      【讨论】:

      • 谢谢,您在我的 JS 代码中添加了()。是的,这更舒服,因为在我的例子中,在这个函数声明之后我应该这样调用它:var titles = get_title(); var title1 = titles('p1')
      【解决方案4】:

      我认为没有理由为此创建函数,除非您需要从其他函数中访问 $title 数据,在这种情况下,您最好将 $title 作为参数传递给其他函数.

      【讨论】:

        【解决方案5】:

        您可以使用static 变量轻松地做您想做的事:

        function get_title($keyword) {
        
            static $titles = null;
        
            if($titles === null) {
                $titles = array(
                    'p1'   => 'Title 1',
                    'p2'   => 'Title 2',
                    // ... other data
                    'pm'   => 'Some other title',
                    'pn'   => 'One more title'
                );
            }
        
            return $titles[$keyword];
        }
        

        “初始化为null/check/set value”技巧(而不是直接设置$titles的值)允许您使用任何您喜欢的代码来初始化变量(包括非常量表达式)。

        比起global,我当然更喜欢这个,因为它更好地隐藏了$titles 是如何产生的细节。类静态属性是另一种实现此目的的方法;在两者之间进行选择是恕我直言的风格问题。

        【讨论】:

          【解决方案6】:

          在 php 中,函数变量是本地的,它们对外部世界不可见,就像在 javascript 中一样。如果你想让 php var 像 javascript var 一样工作,你需要在变量前面添加 global,像这样 -> global $var; 现在,由于您不想在每次运行该函数时都设置 $titles,您可以像这样将其声明为静态

          function get_title($keyword) {
          
          static $titles = array(
              'p1'   => 'Title 1',
              'p2'   => 'Title 2',
              // ... other data
              'pm'   => 'Some other title',
              'pn'   => 'One more title'
          );
          
          return $titles[$keyword];
          

          }

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-11
            • 1970-01-01
            • 1970-01-01
            • 2019-10-03
            • 2012-08-11
            相关资源
            最近更新 更多