使用include时PHP类路径冲突

时间:2012-07-30 20:50:22

标签: php class path include

我遇到包含课程的问题。这是解释问题的一个简单示例:

班级号。 1(路径:/home/day/Class_A.php):

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

班级号。 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文件相同。

我的问题是: 有没有一种简单易行的方法来解决这个问题?

3 个答案:

答案 0 :(得分:5)

尝试更改:

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

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

这样,您的include将相对于正在执行include(Class_B)的文件。

答案 1 :(得分:0)

看起来greeting不是静态函数,所以你不能这样做:

Class_B::greeting();

您必须获取B类对象并在其上调用问候语或将static添加到greetings声明。

其次,为什么不使用require_once?在php.php中

require_once('test/ClassB.php');

在ClassB.php中:

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

答案 2 :(得分: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