【问题标题】:PHP Class path confliction when using include使用包含时的PHP类路径冲突
【发布时间】:2012-07-30 20:50:22
【问题描述】:

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

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

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

【问题讨论】:

  • 将类存储在可以添加到包含路径的目录下。使用 require_once 并使路径(在 require_once 构造中)相对于添加到类的包含路径的路径。

标签: php class path include


【解决方案1】:

尝试改变:

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

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

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

【讨论】:

  • 谢谢,但我实际上想要相反的,那就是:它总是相对于类。
  • Class_B 是否总是在/dir/test/ 而Class_A 是否总是在/dir/day/ 中?
  • 那如果你用我给的方法应该没问题。 dirname(__FILE__) 返回执行代码的文件的路径,即 Class_B。
  • 是的。我之前错过了“..”之前的“/”。这就是我一直在寻找的。谢谢大佬。
  • 啊,很好,很抱歉,是的,我最初忘记了,然后编辑了帖子以添加/,但你很快就在编辑前尝试了:)
【解决方案2】:

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

Class_B::greeting();

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

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

require_once('test/ClassB.php');

在 ClassB.php 中:

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

【讨论】:

  • 我读到 require_once 不是一个好主意,因为它会丢失内存。不记得原因了。我会修复 Class_B..
  • 并不是说它会丢失内存,而是它增加了逻辑,因为它必须检查文件是否已经加载,但我认为好处和简单性超过了这些小的性能问题。看看这个:stackoverflow.com/questions/186338/…
【解决方案3】:

使用 __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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 2011-02-15
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多