PHP中的全局变量

时间:2011-03-30 21:56:32

标签: php

我正在编写一个脚本,它会多次从输入文件中的单词中选择一个随机单词。现在多次调用file()似乎效率低下,所以我正在考虑为文件中的单词设置一个全局数组,并将一个函数加载到数组中(在选择随机单词之前调用)。为什么不起作用?

global $words;

function init_words($file)
{
    $words = file($file);
    $count = count($words);
    echo "$count words<br>\n"; // "3 words"
}

init_words("/foo/bar");
$count = count($words);
echo "$count words<br>\n"; // "0 words" 

5 个答案:

答案 0 :(得分:5)

您需要在函数本身内声明$words全局。参见:

$words = '';

function init_words($file)
{
    global $words;
    $words = file($file);
    $count = count($words);
    echo "$count words<br>\n"; // "3 words"
}

我建议你查看PHP手册中的variable scope chapter

顺便说一句,我绝不会以这种方式编写这段代码。除非绝对必要,否则请避免使用全局变量。

我会以这种方式编写代码以避免此问题:

function init_words($file)
{
    $words = file($file);
    $count = count($words);
    echo "$count words<br>\n"; // "3 words"
    return $words;
}

$words = init_words("/foo/bar");
$count = count($words);
echo "$count words<br>\n"; // "3 words" 

有关详细信息,请参阅PHP手册中的returning values chapter

答案 1 :(得分:2)

你想在函数里面global $words;。更好的是,使用超全球$GLOBALS

答案 2 :(得分:1)

$words = null;

function init_words($file)
{
    global $words;
    $words = file($file);
    $count = count($words);
    echo "$count words<br>\n"; // "3 words"
}

init_words("/foo/bar");
$count = count($words);
echo "$count words<br>\n"; // "0 words" 

global部分应该进入你的功能

旁注:使用全局运算符并不总是最好的

答案 3 :(得分:0)

首先,您需要将单词存储在序列化的共振峰中,这意味着

$file_location = "/foo/bar/words.txt";
$words = array("game", "cool", "why");
$words = serilize($words);
write_words_file($words, $filelocation); //Create the function so it can write to a file

然后你需要编辑你的init_words

function init_words($file)
{
    global $words;
    $data = file_get_contents($file);
    $words = unserialize($data);
    $count = count($words);
    echo "$count words<br>\n"; // "3 words"
}

init_words("/foo/bar/words.txt");
$count = count($words);
echo "$count words<br>\n"; // "0 words" 

答案 4 :(得分:0)

或者,您可以使用以下内容并完全避免使用global

function init_words($fname)
{
    $w = file($fname, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);  // We don't want the trailing spaces or empty lines.
    $c = count($w);

    return array($w, $c);
}

list($words, $count) = init_words("Some_File.txt");

在这种情况下,如果你不得不对单词列表进行任何操作,你可以在init_words()内完成所有操作,而不是在脚本的其他地方。