Мой php немного ржавый, но сейчас это пугает мой разум. Я googled это и прочитал все вопросы stackoverflow, которые я мог найти, которые выглядели связанными, но все они, казалось, имели в себе законные неопределенные переменные. Это заставляет меня поверить, что моя проблема – это одна и та же проблема, но не смотря на простой код кода, который я уменьшил, похоже, что-то меня достает. Пожалуйста, дайте мне мой колпачок и скажите мне, что я сделал не так!
<?php //test for damn undefined variable error $msgs = ""; function add_msg($msg){ $msgs .= "<div>$msg</div>"; } function print_msgs(){ print $msgs; } add_msg("test"); add_msg("test2"); print_msgs(); ?>
Это дает мне следующий, безумный вывод:
Примечание. Неопределенная переменная: msgs в C: \ wamp \ www \ fgwl \ php-lib \ fgwlshared.php в строке 7
Примечание. Неопределенная переменная: msgs в C: \ wamp \ www \ fgwl \ php-lib \ fgwlshared.php в строке 7
Примечание. Неопределенная переменная: msgs в C: \ wamp \ www \ fgwl \ php-lib \ fgwlshared.php в строке 10
Да, это должен быть общий файл, но на данный момент я разделил его на то, что я вставил. Есть идеи?
Он определяется в глобальном масштабе. Используйте global
если хотите его использовать.
<?php $msgs = ""; function add_msg($msg){ global $msgs; $msgs .= "<div>$msg</div>"; } function print_msgs(){ global $msgs; print $msgs; } add_msg("test"); add_msg("test2"); print_msgs(); ?>
global
говорит, что PHP должен использовать глобальную переменную в области локальных функций.
Использование глобалов для чего-то подобного – это плохая практика. Рассмотрим альтернативный подход, например:
class MessageQueue { private static $msgs; public static function add_msg($msg){ self::$msgs .= "<div>$msg</div>"; } public static function print_msgs(){ print self::$msgs; } } MessageQueue::add_msg("test"); MessageQueue::add_msg("test2"); MessageQueue::print_msgs();
если вы не хотите использовать глобальные переменные, вы можете использовать jast
function add_msg($msg) { echo "<div>$msg</div>"; } add_msg("test"); add_msg("test2");
функции, результат будет таким же.