我遇到包含课程的问题。这是解释问题的一个简单示例:
班级号。 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文件相同。
我的问题是: 有没有一种简单易行的方法来解决这个问题?
答案 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