有时我必须使用include_once
和include
,这取决于页面的访问方式。例如:
sales.php
include("class/pdoDatabase.php");
include("class/ClassExample.php");
$obj = new ClassExample();
$obj->getNewItem(1);
ClassExample.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_once
中使用ClassExample.php
,因为pdoDatabase.php
可能已加载sales.php
1}}。
如果使用POST查询直接访问文件ClassExample.php,则表示必须加载文件并创建对象。
问题: 问题是当你直接访问ClassExample.php时 - 它找不到class / pdoDatabase.php。当sales.php加载class / pdoDatabase.php文件
时,它工作正常答案 0 :(得分:1)
这不是include_once的问题,包括差异。这是相对路径的问题。 Include始终使用相对于被调用的php文件的路径。你有这个文件结构:
sales.php
[class]
- pdoDatabase.php
- ClassExample.php
当你致电sales.php
时一切正常,但当你致电ClassExample.php
时,它正试图找到不存在的class/class/pdoDatabase.php
。
更改ClassExample.php
include_once(dirname(__FILE__)."/pdoDatabase.php");
并在任何地方使用相同的模式。
答案 1 :(得分: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()
。