используя «глобальный» в PHP - PullRequest
4 голосов
/ 10 июня 2011

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

Вот myGlobals.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 будет ресурсом, задан ноль в C: \ xampp \ htdocs \ addDbRecords.php на линия 29 "

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 10 июня 2011

Итак, у вас есть:

<?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']);
1 голос
/ 10 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...