0

この例は http://www.php.net/manual/ru/function.spl-autoload.php#92767から入手できます。

ただし、これによりエラーが発生します*致命的なエラー:spl_autoload()[function.spl-autoload]:18行目のC:\ my_projects \ site.local \ www\index.phpにクラススペースを読み込めませんでした*

/index.php

// Your custom class dir
define('CLASS_DIR', 'oop/classes');

// Add your class dir to include path
set_include_path(get_include_path().PATH_SEPARATOR.CLASS_DIR);


// You can use this trick to make autoloader look for commonly used "My.class.php" type filenames
spl_autoload_extensions('.class.php');

// Use default autoload implementation
spl_autoload_register();

new space/my;

/oop/classes/space/my.class.php

namespace space;
class my{
  public function __construct{
    var_dump('space class was here!');
  }
}

PSR-0については知っていますが、私の場合、ビルドされた関数がどのように機能するかを理解する必要があります

4

2 に答える 2

3
new space/my;

should be

new space\my;

Note: you missed () of the __construct in my.class.php

于 2012-08-24T10:06:12.837 に答える
2

次のコード行は、言語構文を思ったように使用していないため、構文エラーである可能性があります。

new space/my;

ここにあるものを分解しましょう。

  • new-newキーワード、新しいオブジェクトをインスタンス化するために使用します。
  • space- クラスの名前、ここでは string "space".
  • /-除算演算子.
  • mymy- 未定義の場合に文字列になる(未定義?) 定数"my"

それがそうであるため(それが言語です)、PHPは自然にクラスをインスタンス化しようとしspace、次に文字列でそれを分割しようとします"my"。例:

$object = new space;
define('my', 0);
$result = $object / my;

自動ロードとクラスのspace非存在を使用しているため、致命的なエラーが表示されます。

厳密に言えば、構文エラーは PHP にあるのではなく、間違った構文を使用しているためです (ここでは、名前空間を区切るための正しい記号の/代わりに)。\

これが役に立てば幸いです。インスタンス化された可能性のある既存のクラスがゼロ除算の警告を生成する可能性があるため、PHP の型付けが緩いことに注意してください。

デバッグspl_autoload_register:これは、オートローダー コールバック関数を使用しない場合の内部関数であるため、デバッグ目的で次のように拡張できます。

spl_autoload_register(funcion($class) {
    echo 'Autoloading class: ', var_dump($class), "\n";
    return spl_autoload($class);
});

また、既存のものを上書きする代わりに、拡張機能を追加することもできます:

($current = spl_autoload_extensions()) && $current .= ',';
spl_autoload_extensions($current . '.class.php');
# .inc,.php,.class.php
于 2012-08-24T10:49:05.953 に答える