2015-10-29 23 views
0

轉移我有一個包含一個類文件。我需要include這個文件,當我需要訪問類。我想在類中存在的文件中聲明類,這樣我只需要聲明一次類,並且只需要include即可使用該類。

This Works。

<?php 

$GLOBALS['foo_model'] = new foo_model; 
$foo_model = $GLOBALS['foo_model']; 
global $foo_model; 

Class foo_model 
{ 
    function foo_function() { 
     // ect 
    } 
} 

這不起作用

<?php 

$foo_model = new foo_model; 
global $foo_model; 

Class foo_model 
{ 
    function foo_function() { 
     // ect 
    } 
} 

它會導致類時嘗試使用的錯誤。

Call to a member function foo_function() on a non-object 

爲什麼我有$GLOBALS開始,然後把它變成一個常規的變量,然後應用global。我認爲$GLOBALSglobal只是語法不同。 $GLOBALS在這裏有什麼不同?

此外,寫入包含類的文件的最佳方法是什麼,以便我可以使用該文件並使用該類,而不必在包含該文件後聲明該類,而不使用$GLOBALS?我的第一個代碼片段是完成此任務的最佳方式嗎?

+0

我會與類定義,然後實例啓動。 –

+0

如果你的意思是把'$ api_model = new api_model; global $ api_model;'在文件底部,仍然彈出一個非對象錯誤。 – Goose

回答

1

不要做這種方式,這是非常糟糕的設計。嘗試使用特質。

但我看到你正在試圖做的是創建類文件並加載它,而不包括它。這就是自動加載器類的概念。 查看結果:http://php.net/manual/en/function.autoload.php

記住:globals總是有問題,只要有可能就避免它們。

+0

我以前沒有聽說過特質。我會研究特質,並考慮自動加載對我的情況是否正確,並會回覆給您。 – Goose

+0

事實證明,我需要將我的代碼從程序變爲面向對象,以便這些全局問題消失。然而,你的答案在得出這個結論時是無價的。我仍然想知道爲什麼'GLOBALS'在這種情況下的行爲與'global'不同。 – Goose

+1

對不起,如果我不能幫助你更多,但從我的理解和說明手冊,自動加載正是你所需要的 - 這是它的設計方式,以創建類,而不包括他們的文件。 至於爲什麼,全局關鍵字是在棄用,你的PHP版本是什麼?此外,從http://php.net/manual/en/reserved.variables.globals.php $ _GLOBALS是使用全局作用域的正確方法。還要注意,從PHP 5.3.0開始,如果你在像你這樣的函數內使用它,你需要用global關鍵字聲明變量。 當然變爲OO dispears使用時,作爲OO你都在同一範圍內 – Marco

相關問題