Используя "глобальный" в 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) для глобальной и локальной переменной функции. Локальная область действия функции скрывает имя глобальной переменной. Если у вас есть глобальный объект, вам не нужно передавать его в вашу функцию; если вы делаете, не используйте одно и то же имя для него.