2012-11-29 181 views
1

我將直截了當地指出這一點。似乎無法在互聯網上的任何地方找到它。也許這是不可能的,我不知道。我真的很喜歡用「分而治之」的方法,自己創造它。儘可能多地分割文件以便於管理(小文件等)。PHP使用另一個包含文件中的包含文件中的對象

但這裏是我的問題:

我有5個文件:

index.php 
inc/config.php 
inc/Database.class.php 
inc/sidebar.php 
inc/forms.php 

好吧,我做了什麼是這樣的:

在我的config.php文件

我包括數據庫。 class.php文件並創建一個對象。

include 'Database.class.php'; 

$user = "root"; 
$pass = ""; 
$host = "localhost"; 
$database = "blah blah"; 

$db = new Database($user, $pass, $host, $database); 
$db->connect(); 

所以我將這個config.php和sidebar.php包含在我的index.php文件中。

(縮短了的代碼,但它的作用是相同的)

include 'inc/config.php'; 
include 'inc/sidebar.php'; 

在我的側欄我有一個形式,供用戶登錄。我使用print_r來調試我的文件,看看是否有任何東西返回,我省略了方法loginFormShow,因爲它非常長,不相關)

function loginFormProcess($user, $pass) 
{ 
    $db->select(blah blah some variables); 
    $res = $db->getResult(); 
    print_r($res); 
} 


if (!isset($_POST['submit'])) { 
    loginFormShow(); 
} else { 

    if ($_POST['user'] == "") 
    { 
     loginFormShow(1); 
    } 
    else if ($_POST['pass'] == "") 
    { 
     loginFormShow(2); 
    } 
    else 
    { 
     $user = $_POST['user']; 
     $pass = $_POST['pass']; 
     loginFormProcess($user, $pass); 
    } 
} 

因此,問題是什麼。當我嘗試調用函數loginFormProcess時,它不能使用對象$ db。

我可以爲此使用1個對象嗎?因爲在索引頁面上,我將要求數據庫中的其他數據。我是否需要爲索引頁面和登錄表單創建一個對象?

有沒有其他解決方案? 如果我不清楚,我想提供一些更多的解釋。

乾杯,

Clemenz

+2

作用域規則仍然適用於$ db變量,即使它是一個對象而不是一個簡單的標量......僅僅因爲它是一個對象,不會使它成爲全局的 - 所以它不是' t在你的loginFormProcess()函數中的作用域 –

+0

我如何在沒有創建另一個對象的情況下在正確的作用域中獲取它。我只想爲一個對象使用多個函數。這是否可行? – Clemenz

+0

您將它作爲參數傳遞給loginFormProcess()函數,正如Madara的答案所示,完全如同您將任何其他變量傳遞給函數一樣 –

回答

3

最好的解決辦法是將數據庫對象傳遞給函數的參數如下:

function loginFormProcess($user, $pass, Database $db) { 

並用適當的數據庫對象調用它。這就是所知的

+0

但我在config.php中聲明$ db不在database.class.php中。所以,如果我在netbeans中嘗試這個,它會給我一個錯誤。所以我嘗試使用下面的代碼: 'function loginFormProcess($ user,$ pass,Database :: $ db){' 不能正常工作:致命錯誤:在'inc \ loginform.php'中找不到類'Database'在線111' – Clemenz

+0

@Clemenz:在這種情況下,[標籤:自動加載器]是有序的。 –

+0

@Clemenz:不,我沒有說'Database :: $ db',我說'Database $ db'。它被稱爲類型提示。 –

0

試試這個:

function loginFormProcess($user, $pass) 
{ 
    global $db; 
    $db->select(blah blah some variables); 
    $res = $db->getResult(); 
    print_r($res); 
} 

參考:http://php.net/manual/en/language.variables.scope.php

+2

三個答案,所有傳播不良行爲....通過$ db作爲一個理論,不要使用全球通用萬能藥 –

+0

我應該如何通過這個?它在config.php中聲明,包含在index.php中。和forms.php(我使用$ db)包含在index.php中包含的sidebar.php中。該死的,我包括很多。 – Clemenz

+0

對於我的解決方案,您可以在您的sidebar.php文件中添加全局$ db。但其他評論者是正確的。這個解決方案只不過是一個快速而骯髒的破解。嘗試研究面向對象的設計原則。從長遠來看,這將節省您的時間。一本好書是「首先面向對象的分析和設計」。 – Thomas

0

變量$ DB是建立在你的config.php文件中的全局變量。這在loginFormProcess函數內是不可見的。您可以使用的shotcut解決方案是通過添加語句global $ db聲明您使用全局變量的意圖;作爲函數中的第一條語句

相關問題