Используя "глобальный" в PHP

Я нахожусь в режиме обучения, очень плохо знаком с PHP, поэтому я работаю с примером кода. Пожалуйста, прости меня за использование 'global' здесь, но я хочу понять область видимости переменной php.

Вот мой Globals.php:

<?php 
     global $db_server;
   // other code not shown
?>

Вот connectToDb.php:

<?php
      require_once 'myGlobals.php';

      // no declared functions in this file, all inline code
      $db_server = mysql_connect(.....);
      mysql_select_db( "theDatabase", $db_server);
?>

Вот addDbRecords.php:

<?php
       require_once 'myGlobals.php';

       // other inline code.....
       doAddDeleteRecord($db_server);

function doAddDeleteRecord($db_server)
{
  //global $db_server;

  if( !mysql_query($query, $db_server))
   {
         // handle the error...
   }
 }
?>

Вот index.php:

<?php
      require_once 'myGlobals.php';
      require_once 'connectToDb.php';
      require_once 'addDbRecords.php';

     // this is simplified, just trying to show that everything in inline code
 ?>

Здесь проблема. Когда я звоню doAddDeleteRecord($db_server) внутри файла addDbRecords.php выше, $db_server недействительно - это ноль - когда я звоню mysql_query(.., $db_server, ...) - это сообщение об ошибке:

"Предупреждение: mysql_query() ожидает, что параметр 2 будет ресурсом, значение NULL указано в C: \ xampp \ htdocs \ addDbRecords.php в строке 29"

Поэтому я попытался использовать глобальное объявление внутри doAddDeleteRecord() (закомментировано выше) - без изменений.
mysql_query(...) все еще терпит неудачу со значением NULL для $db_server,

Я знаю mysql_connect(....) работает, потому что другой код удаляет все мои записи из моей базы данных успешно (с помощью SELECT) и существующие записи отображаются правильно в браузере.

Так что на мой взгляд, тот факт, что $db_server объявляется с "глобальным" должно означать, что сфера $db_server таков, что когда-то mysql_connect(...) называется - в области видимости файла во всех моих файлах, $db_server будет действительное соединение с моей базой данных.

Я только пытаюсь узнать о php scoping, а не OOAD или что-нибудь еще (пока). Почему $db_server() здесь ноль?

2 ответа

Решение

Так что у тебя есть:

<?php 
     global $db_server;
   // other code not shown
?>

и вы включаете это, где это необходимо:

require_once 'myGlobals.php';
// other inline code.....
doAddDeleteRecord($db_server);

Проблема в том, что если вы уже включили myGlobals.php в другом месте, он не будет включен здесь. Таким образом, вы не можете гарантировать, что глобальный охват будет достигнут.

Вместо этого напишите:

require 'myGlobals.php';
// other inline code.....
doAddDeleteRecord($db_server);

Или используйте гораздо лучший подход:

// other inline code.....
doAddDeleteRecord($GLOBALS['db_server']);

Я думаю, что есть проблема с сокрытием области; то есть вы используете одно и то же имя ($db_server) для глобальной и локальной переменной функции. Локальная область действия функции скрывает имя глобальной переменной. Если у вас есть глобальный объект, вам не нужно передавать его в вашу функцию; если вы делаете, не используйте одно и то же имя для него.

Другие вопросы по тегам