0

我对包含课程有疑问。下面是一个简单的例子来解释这个问题:

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

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

4

3 回答 3

5

尝试改变:

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

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

这样,您的包含将与正在执行包含 (Class_B) 的文件相关。

于 2012-07-30T20:53:16.990 回答
0

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

Class_B::greeting();

您必须获得一个 B 类对象并在其上调用 greeting 或添加staticgreetings声明中。

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

require_once('test/ClassB.php');

在 ClassB.php 中:

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

于 2012-07-30T20:55:56.143 回答
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

于 2012-07-30T21:11:44.320 回答