Глобальные переменные в 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" 

Вам нужно объявить $words global внутри самой функции. Видеть:

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

Предлагаю вам ознакомиться с главой раздела переменной в руководстве по PHP.

В стороне я никогда не буду писать этот код таким образом. Избегайте глобализации, если они не являются абсолютно необходимыми.

Я бы написал ваш код таким образом, чтобы избежать этой проблемы:

 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.

Вы хотите global $words; внутри функции. Еще лучше, используйте суперглобальные $GLOBALS .

 $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 часть должна войти в вашу функцию

Примечание: не всегда лучше использовать глобальные операторы

сначала вам нужно сохранить слова в сериализованном форманте, чтобы

 $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" 

В качестве альтернативы вы можете использовать следующее и избегать 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() а не в другом месте сценария.