2012-07-30 32 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