4

我在这里处于学习模式,对 PHP 非常陌生,所以我正在使用代码示例。请原谅我在这里使用“全局”,但我想了解 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 是资源,在第 29 行的 C:\xampp\htdocs\addDbRecords.php 中给出 null”

所以我尝试在内部使用“全局”声明doAddDeleteRecord()(上面注释掉)——没有变化。
仍然以mysql_query(...)NULL 值失败$db_server

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

所以在我看来,用'global'声明的事实$db_server应该意味着$db_server一旦mysql_connect(...)被调用——在我所有文件的文件范围内,它的范围$db_server将是与我的数据库的有效连接。

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

4

2 回答 2

5

所以你有了:

<?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']);
于 2011-06-10T18:13:36.970 回答
1

我认为范围隐藏存在问题。也就是说,您对全局变量和函数局部变量使用相同的名称 ($db_server)。函数局部作用域隐藏了全局变量名。如果你有一个全局的,你不需要将它传递给你的函数;如果这样做,请不要使用相同的名称。

于 2011-06-10T18:16:56.410 回答