[英]PHP Global Vars
我很沮丧,为什么最简单的方法不起作用。
我想要的只是访问包含文件中声明的变量。
我有一个名为connection.php的文件,其中有一个名为MySqlDatabase的类。 在文件的底部,我创建了该类的实例,并将其辅助到名为$ database的变量中
// filename database.php begin
class MySqlDatabase(){
// code goes here
}
$database = new MySqlDatabase();
// filename database.php end
现在,我在something.php中包含了database.php,并试图像这样访问$ database变量
//something.php
require_once 'database.php';
function foo(){
global $database;
$sql = "some sql statement";
mysql_query($sql,$database->connection);
//and remainig code goes here...
}
当我运行something.php时,预期全局变量$ database应该在foo()函数中可用,但似乎该变量为null,我使用is_object()函数进行了测试,以检查对象是否可用,但返回假。
出于调试目的,我添加了is_object()来检查database.php文件,它返回true。
我也尝试使用其他选项访问全局变量
$database =& $GLOBALS['database'];
但是我仍然没有运气。 然后,我也使用print_r()函数打印了完整的$ GLOBALS数组,但是它没有$ database变量,我也使用了get_defined_vars()进行了检查,但它也没有变量。 但是我可以在包含的文件中看到它们
为了使这个简单的事情生效,我从两天前就不知所措,但是我妥协了并在所有文件中复制粘贴数据库连接代码。
我对您的代码进行了一些更改,这对我来说很有效。
为database.php
<?php
// filename database.php begin
class MySqlDatabase
{
public $connection;
function MySqlDatabase()
{
$this->connection= mysql_connect('HOST','USER','PASSWORD');
mysql_select_db('databaseName',$this->connection);
}
}
$database = new MySqlDatabase();
// filename database.php end
?>
something.php
<?php
require_once 'database.php';
function foo( )
{
global $database ;
$sql = "select * from tableName";
$rs=mysql_query($sql,$database->connection);
while($row=mysql_fetch_array($rs))
{
print_r($row);
}
//and remainig code goes here...
}
foo();
?>
您可能在错误的庄园中操纵$connection
变量。
如果已包含文件,请使用以下命令:
//something.php
require_once 'database.php';
/* Function FOO starts a new scope and doesn't see database object declared in database.php
* Therefore, you pass on the database object from calling function and use that instead.
*/
function foo($dbObj){
$sql = "some sql stagement";
mysql_query($sql,$dbObj->connection);
//and remainig code goes here...
}
foo($database);
只有3种可能的原因
您可以使用单例模式,也可以在数据库类中将变量设置为static。
好吧,我发现了问题所在。 问题出在amfphp框架上。 这个框架包括了我所有的文件(something.php)。 很难解释,但简单地说,我将database.php包含在与amfphp框架相关的主要php文件之一中。
谢谢您的建议。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.