使用include_once和include

时间:2012-10-06 10:45:42

标签: php class

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

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文件

时,它工作正常

2 个答案:

答案 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()