0

時々私は使用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 に POST クエリでファイルに直接アクセスする場合、ファイルをロードしてオブジェクトを作成する必要があります。ClassExample.phppdoDatabase.phpsales.php

問題: ClassExample.php に直接アクセスすると、 class/pdoDatabase.php が見つからないという問題があります。sales.php が class/pdoDatabase.php ファイルをロードすると正常に動作します

4

2 に答える 2

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");

どこでも同じパターンを使用します。

于 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 に答える