如何在没有局部变量的情况下重新设计此PHP代码?

时间:2011-04-24 22:34:01

标签: php javascript closures local-variables

我有这样一个功能:

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中执行此操作?

6 个答案:

答案 0 :(得分:2)

或者:

$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中的闭包。

除非记忆存在问题,否则不要担心。

答案 1 :(得分:2)

在这里听起来像是全球性的。

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

答案 2 :(得分:1)

$titles来自数据库吗?如果没有,这实际上是微优化,我几乎可以说即时变量永远不会成为值得优化的瓶颈。

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

另一个解决方案是使用$titles作为私有静态成员创建一个静态类。然后,只需创建一个调用此数组的公共方法即可。

Theese解决方案只会实例化一次数组。

编辑:啊,Frits完全证明了我的意思。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

您可以使用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 /检查/设置值”技巧(而不是直接设置$titles的值)允许您使用任何您喜欢的代码来初始化变量(包括非常量)表达式)。

我肯定比global更喜欢这个,因为它可以更好地隐藏$titles生成方式的细节。类静态属性是另一种完成此操作的方法;选择两者之间是恕我直言的风格问题。

答案 5 :(得分:1)

好的PHP函数变量是本地的,它们在外部世界是不可见的,就像在javascript中一样。如果你想让php var像javascript一样行动,你需要在变量前面添加全局变量,如下所示 - >全球$ 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];

}