2012-07-30 30 views
0

我有包括類的問題。這裏有一個簡單的例子來解釋這個問題:PHP類路徑衝突使用時包括

Class no。 1(path:/home/day/Class_A.php):

class Class_A { 
    public function sayHi() { 
    echo "Good day"; 
    } 
} 

Class no。 2(路徑:/home/test/Class_B.php):

class Class_B { 
    public function greeting() { 
    if(class_exists("Class_A")!=true) 
     include "../day/Class_A.php"; 
    $test = new Class_A(); 
    $test->sayHi(); 
    } 
} 

PHP文件(路徑:/home/php.php)

if(class_exists("Class_B")!=true) 
    include "test/Class_B.php"; 
    $g = new Class_B; 
    $g->greeting(); 

問題是當php.php包括Class_B和Class_B包括Class_A,Class_B無法打開Class_B,因爲該類的對象路徑現在與php.php文件相同。

我的問題是: 有沒有一個很好的和簡單的方法來解決這個問題?

+0

,您可以添加到包括路徑的目錄下存儲類。使用require_once並相對於添加到類的包含路徑的路徑(在require_once構造中)創建路徑。 – ghbarratt 2012-07-30 20:53:38

回答

5

嘗試改變:

include "../day/Class_A.php"; 

include dirname(__FILE__) . '/../day/Class_A.php'; 

這樣,你包括將相對於在執行該包括(Class_B)文件。

+0

謝謝,但我實際上想要的是相反的,那就是:它總是相對於班級。 – user1163278 2012-07-30 21:06:21

+0

Class_B總是在'/ dir/test /'中,而Class_A總是在'/ dir/day /'中? – drew010 2012-07-30 21:12:02

+0

是的,但他們會從各種文件夾中調用,造成問題.. – user1163278 2012-07-30 21:18:50

0

貌似greeting是不是一個靜態的功能,所以你不能這樣做:

Class_B::greeting();

你必須得到一個B類對象,並呼籲問候語或添加staticgreetings聲明。

二,爲什麼不使用require_once?在php.php

require_once('test/ClassB.php');

而且在ClassB.php:

require_once('../day/ClassA.php');

+0

我讀了require_once不是一個好主意,因爲它失去了記憶。不記得原因。我會修復Class_B .. – user1163278 2012-07-30 21:08:27

+0

不是它失去了內存,但它增加了邏輯,因爲它必須檢查一個文件是否已經被加載,但我認爲這些小的性能問題帶來的好處和簡單性超出了這個範圍。看看這個:http://stackoverflow.com/questions/186338/why-is-require-once-so-bad-to-use – 2012-07-31 14:22:41

0

使用__autoload這是一個神奇的功能,您定義的,它使PHP,讓你知道什麼時候它不沒有加載類,但該類需要加載。

If you define the __autoload function like so, 
function __autoload ($classname) 
{ 
    require('/path/to/my/classes/'.$classname.'.php'); 
} 
you no longer need to add 
require_once('/path/to/my/classes/MyClass.php'); 
into your files, because the first time that PHP encounters 
$mine = new MyClass(); 
or 
MyClass::staticMethodCall(); 
it will automatically call the __autoload function that you defined earlier. 
__autoload('MyClass'); 

資源:http://blog.samshull.com/2010/02/why-you-should-use-autoload-function-in.html