我有这样一个功能:
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中执行此操作?
答案 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];
}