2012-02-13 145 views
0

好吧,我已经做出了单独的类连接到我的数据库和类是在一个单独的PHP文件PHP未定义类变量

connect.php

class connect{ 
    function __construct(){ 
     // connect to database 
    } 
    function query($q){ 
     // executing query 
    } 
} 
$connect = new connect(); 

现在,我做的对象类$连接,当在一个文件中使用像的index.php它的工作原理

的index.php

require_once('connect.php'); 
$set = $connect->query("SELECT * FROM set"); 

现在,在这里它工作正常,我没有重新创建的类的对象,并直接执行查询,其中在另一个文件名为header.php中我有这样

的header.php类

class header{ 
    function __construct(){ 
    require_once('connect.php'); 
    // Here the problem arises i have to re declare the object of the connection class 
    // Without that it throws an error undefined variable connect 
    $res = $connect->query("SELECT * FROM table"); 
    } 
} 

为什么它在index.php上工作,而不是在header.php上,我希望你明白我在说什么

+2

除了不好的做法,它sh会工作。更好的方法是做'new header($ connect)',例如注入依赖关系。 – Gordon 2012-02-13 09:22:22

+0

'require_once('connect.php');'在头文件类的'__construct()'中的类头文件和全局$连接;'之外.. – ahmet2106 2012-02-13 09:25:53

+0

@ ahmet2106 [请忘记'全局'存在](http:// stackoverflow.com/questions/5166087/php-global-in-functions/5166527#5166527) – Gordon 2012-02-13 09:26:20

回答

2

你的问题可能在于使用require_once()而不是require()。当您第一次包括connect.php时,它运行良好,因为变量已初始化并且类已加载,但当您再次尝试时禁止重复包含,因此没有变量被初始化。

无论如何使用内部构造函数include()是......很少有理由。包括初始化局部变量的文件也不好。

正确的代码是这样:

<?php 
require_once('connect.php'); 
require_once('header.php'); 

$connect = new Connect(); 
$header = new Header($connect); 

而且header.php

<?php 
class Header{ 
    protected $connection = null; 

    function __construct(Connect $connection){ 
     $this->connection = $connection; 
     $res = $this->connection->query("SELECT * FROM table"); 
    } 
} 

编辑:去除误导约nasted类声明的代码部分通过包括(见戈登的评论和编辑历史)...

+1

第一部分不适用于此。 include会将任何类定义导入全局范围。 OP得到“未定义变量”错误,而不是“类声明不能嵌套”。给出的替代方案虽然很好。 – Gordon 2012-02-13 09:35:02

+0

@戈登感谢您提供的信息,我从来没有这样做,所以我从来没有需要解决这样的问题。我必须考虑如何将其纳入我的答案。 – Vyktor 2012-02-13 09:36:54

+0

Jizzz谢谢.. D – 2012-02-13 09:37:03