0

我有这样的功能:

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 中做到这一点?

4

6 回答 6

2

听起来像全局是合适的。

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

于 2011-04-24T22:41:52.097 回答
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 中的闭包。

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

于 2011-04-24T22:37:18.420 回答
1

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

于 2011-04-24T22:45:33.143 回答
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直接设置值)允许您使用任何您喜欢的代码来初始化变量(包括非常量表达式)。

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

于 2011-04-24T22:47:03.170 回答
1

那么在 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];

}

于 2011-04-24T22:49:55.083 回答
1

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

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

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

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

编辑:啊,Frits 正是我的意思。

于 2011-04-24T22:39:29.947 回答