2012-02-13 143 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