我正在使用PHP的全局声明来为脚本中的许多函数提供一个数组。变量在脚本的顶部声明,并在每个使用它的函数中用global引用,如下所示:
<?php
$myarray = array(1, 2, 3);
function print_my_array() {
global $myarray;
print '<ul>';
foreach($myarray as $entry) {
print '<li>'.$entry.'</li>';
}
print '</ul>';
return 0;
}
print_my_array();
?>
有时,但并非总是如此,在调用函数时未设置数组,在调用foreach时生成错误。在实际代码中,使用的数组具有非常唯一的名称,因此不应该与其他任何内容发生任何冲突。我是否误用全球声明?
答案 0 :(得分:4)
不,该片段是正确的。你遇到的问题是使用全局变量的问题 - 它们可以从任何地方访问和更改(可能是偶然的),从而产生难以发现的错误。
答案 1 :(得分:1)
通过使用全局变量,你可以遇到很多陷阱,它们也会让你的代码减少可重复使用。
以下是您的功能示例,可以在整个网站上多次重复使用。
(未测试的)
<?php
function arrayTags($items, $open = '<li>', $close = '</li>')
{
if (is_array($items) && count($items) != 0)
{
$output = null;
foreach ($items as $item) {
$output .= $open . $item . $close;
}
return $output;
}
else
{
return '';
}
}
// Default, <li>
echo '<ul>' . arrayTags($myarray) . '</ul>';
// or, spans:
echo '<div id="container">' . arrayTags($myarray, '<span>', '</span>') . '</div>';
答案 2 :(得分:0)
在运行foreach之前,至少可以检查函数顶部的数组是否为null。这至少可以防止错误:
function print_my_array() {
global $myarray;
if(!empty($myarray)) {
print '<ul>';
foreach($myarray as $entry) {
print '<li>'.$entry.'</li>';
}
print '</ul>';
}
}
另外,我不会因为它的地狱而返回0。您可能希望将此数组中的数组是否为空而合并。
答案 3 :(得分:0)
$myarray = array(1, 2, 3);
简而言之,你必须这样声明:
$myarray = array();
如果你想用值填充它,请在类构造函数中执行:
public function __construct(){
$myarray = array(1,2,3);
}
我不是大师,但根据我的经验,似乎php不喜欢在类中的函数之外执行函数调用。
这不起作用:
class MyClass {
public $mystring = myfunction();
public function myFunction(){
return true; //and your function code
}
}
所以当你使用array()它实际上并没有触发任何函数调用时,它只是创建一个类型为array的空变量。当你使用数组(1,2,3)时,它必须有效地运行'create array',就像一个函数。
我知道很讨厌,我希望它有所不同,但我不知道在php中做你想做的事情。让我知道,如果有一种很好的方式,我很乐意听到它!