autoloadをrequire_onceと同じように動かすためにはdebug_backtraceを使わないといけない?
読み込むファイルはまずカレントのワーキングディレクトリからの相対パスとしてinclude_path で探され、それから、カレントのスクリプトのディレクトリからの相対パスとしてinclude_path で探されます。 例えば、include_pathが librariesで、カレントの ワーキングディレクトリが /www/ の 場合、include/a.php を読み込んで、そのファイルの中に include "b.php" と書いてあったとすると、 b.php がまず /www/librariesで探され、その後、 /www/include/で探されます。 ファイル名が ./ あるいは ../ で始まっている場合は、 カレントのワーキングディレクトリからの相対パスとして探されるのみとなります。
http://php.net/include
例えばrequire_onceをやめてautoload.phpという別のファイルでまとめて処理するようにした場合、autoload.phpに書いたrequire_onceはautoload.phpからの相対パスとして探索される。
深いディレクトリにライブラリを入れた場合、そのディレクトリもinclude_pathに追加しないといけない。ライブラリごとにディレクトリを分けた場合、include_pathが増えていくことになる?
こういうことを考えたのはプラグインごとにディレクトリを作ってそこにファイルをまとめた場合に面倒なことになりそうな予感がしたから。
せっかくspl_autoload_register使うなら、requireもdirname(__FILE__)もなくしたい。
<?php class AutoloadSample { static public function autoload($name) { $bt = debug_backtrace(); $baseDir = dirname($bt[1]['file']); //$name = str_replace('_', '/', $name); // ※ $file = $baseDir . "/$name.php"; if (file_exists($file)) require_once $file; } }
htdocsとかindex.phpからの相対パスに関わらないautoloadはこんな感じ?
でもこれだと※の箇所みたいなディレクトリ構成はできないなぁ。
基本は_を/に変換する方式で、$baseDir .= $pluginDir; とかにして$pluginDirを初期化で設定するなり何なり…うーん。