requireを使ってファイルを読み込む場合やHTMLのリンクを作成する場合に、アドレスを指定する方法として相対パスと絶対パスがある。
僕は最初、requireに関しては全部相対パスで書いていたのだけど、ページをいくつも作っているうちにファイルがだいぶ増えてきたので、ファイルをいくつかにフォルダ分けすることにした。初めは全てのファイルをblogというフォルダの中に置いておいたのだが、そのblogというフォルダの中に3つほど新たにフォルダを作って、HTML関連のものやPHP関連のファイルに分けた。
こうなると、ファイルの置いてある階層が変わってくるので、パスの指定の部分も当然変わってくる。
そんなとき、いちいち全てのファイルをチェックしてパスが書いてある部分を一つ一つ書き換えるなんてのは面倒だ。ファイルが増えれば増えるほど、時間と手間とストレスも比例する。特に絶対パスの場合は、前半部分は基本的に一緒なので、何か定数を作っておいてやると、作業が一気に楽になる。最初からどれだけのファイル数になってフォルダはいくつに分けておいた方がいいみたいな仕様を何も考えていないからこんなことになるんだと言われてしまえば、すみませんとしか言いようがないけど。
例えば、localhostのblogというフォルダの中にbody, admin, phpという3つのフォルダがあったとしたら
define('WEB_ROOT','http://localhost/blog/');
define('ADMIN_PATH',WEB_ROOT.'admin/');
define('BODY_PATH',WEB_ROOT.'body/');
define('PHP_PATH',WEB_ROOT.'php/');
こんな感じにしておくと、新しいフォルダを作ってその中にファイルを移したりした場合でも、いちいちrequireの中身を変える必要はなくなる。
require(PHP_PATH.'blog.php');
require(PHP_PATH.'edit.php');
みたいに書いておけば、パスが変わってもPHP_PATHを書き換えるだけで済む。先輩のzuyaさん曰く「ソースの中身を変更させようと思ったとき、修正箇所がなるべく少なくなるように書くのがいい」とのことなので、こういうのは積極的にやっておいた方がいいだろう。まあ、修正箇所が少ない方が作業効率がいいのは別にプログラム初心者とか関係なく僕にも分かる。
さて、こんな説明をしておきながらなんなのだけど、実はこれにはちょっと問題があるようで、これだとrequireが正常に機能しない。簡単にいうと、エラーが出る。僕の書き方に問題があったのかは実のところグレーゾーンなまま解決させてしまったのだけど、とりあえず僕の書いたソースではエラーが出た。
<form method="post" action="<? php PHP_PATH ?>edit.php">
<a href="<?php BODY_PATH ?>blog.php">リンク先</a>
こんな風に、HTMLタグの中で書くような場合は、特に問題なく動いてた。
そこで、今度はこんなのを作ってみた。
define('ROOT_DIR',realpath(dirname(_FILE_).'/../').'/');
realpathってのは正規化された絶対パスを生成する?みたいなやつらしく(参照:このページ)、出力結果だけでいえば上のWEB_ROOTとたいして変わらない・・・と思う。しかしこれを使わないとrequireなんかは上手く読み込んでくれなかったりする。
define('ADMIN_PATH',ROOT_DIR.'admin/');
define('BODY_PATH',ROOT_DIR.'body/');
define('PHP_PATH',ROOT_DIR.'php/');
これで問題は解決・・・・・・
かと思いきや、今度はformのactionの方でエラーが出るようになった。
なので、WEB_ROOTとROOT_DIRの両方を作っといて、動く方を使えば、一応何とかなるみたい。
何で動いたり動かなかったりするのかはまだよく分かってないけど、グレーなままにしておくと後々よくない結果を招くかもしれないので、時間を見つけて調べておこうと思います。
あ、それからWEB_ROOTとかROOT_DIRなんかは僕が勝手につけた定数名なので、別にこの名称にしなきゃ動かないってことはないです。PHP_PATHとかもね。
LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。