0

有时我必须使用它include_onceinclude这取决于页面的访问方式。例如:

销售.php

include("class/pdoDatabase.php");
include("class/ClassExample.php");

$obj = new ClassExample();
$obj->getNewItem(1);

类示例.php

include_once("class/pdoDatabase.php");

class ClassExample {
  public function  getNewItem($id) { .. }
   public function addNew($id) { .. }
}

// Accessing this file directly via Ajax request 
if (isset($_POST['AddNew'])) {
   $obj = new ClassExample ();
   $obj->addNew($_POST['id']);
 }
}

如果您访问 sales.php ,然后将加载include("class/ClassExample.php");,但是我必须使用include_oncein ,ClassExample.php因为pdoDatabase.php可能已经加载了sales.php。如果您使用 POST 查询直接访问 ClassExample.php 文件,这意味着它必须加载文件并创建一个对象。

问题:问题是当您直接访问 ClassExample.php 时 - 它找不到 class/pdoDatabase.php。当 sales.php 加载 class/pdoDatabase.php 文件时它工作正常

4

2 回答 2

1

这不是 include_once 和包含差异的问题。这是相对路径的问题。包含始终使用相对于被调用 php 文件的路径。你有这个文件结构:

sales.php
[class]
 - pdoDatabase.php
 - ClassExample.php

当你打电话时sales.php一切都好,但是当你打电话时ClassExample.php它试图找到class/class/pdoDatabase.php不存在的。

更改包含行中的ClassExample.php

include_once(dirname(__FILE__)."/pdoDatabase.php");

并在任何地方使用相同的模式。

于 2012-10-06T11:44:23.510 回答
0

你这样做是不对的。

您应该使用在应用程序的引导阶段初始化的自动加载器,而不是手动加载每个类文件。类似于以下内容:

$root = __DIR__;

spl_autoload_register(function( $className ) use ( $root ){

    $className = str_replace( '\\', '/', $className );
    $filepath = $root . '/' . strtolower( $className ) . '.php';

    if ( !file_exists($filepath) )
    {
        return false;
    }

    require $filepath;
    return true;
});

要了解更多信息,请阅读spl_autoload_register()手册中的内容。

于 2012-10-07T01:25:28.883 回答