使用';global';在php中


using 'global' in php

我在这里处于学习模式,对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
 ?>

问题来了。当我在文件addDbRecords.php中调用doAddDeleteRecord($db_server)时上面,当我调用mysql_query(.., $db_server, ...)时,$db_server无效--它为空--这是错误消息:

"警告:mysql_query()需要参数2为资源,给定为null在C:''examplep''htdocs''addDbRecords.php上第29行"

因此,我尝试在doAddDeleteRecord()中使用"global"声明(如上所述)——没有更改
mysql_query(...)仍然失败,$db_server的值为NULL。

我知道mysql_connect(....)之所以有效,是因为其他代码成功地(使用SELECT)将我的所有记录从数据库中提取出来,并且现有记录能够在浏览器中正确显示。

因此,在我看来,$db_server用"global"声明的事实应该意味着$db_server的作用域是这样的,一旦调用了mysql_connect(...)——在我所有文件的文件作用域上,$db_server将是到我数据库的有效连接。

我只是想了解php范围,而不是OOAD或其他任何东西(目前)。为什么$db_server()在这里为空?

因此,您有:

<?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)。函数的局部作用域隐藏全局变量名。如果你有一个全局,你不需要把它传递给你的函数;如果你这样做了,就不要使用相同的名称。