プログラミングは見た目が命です。
PHPで
階層パスが汚い場合に、整える方法を探していたらやりようがあったので、知らない人の為に情報を残しておきます。
パスが汚いとは?
phpファイルを複数フォルダで使っている場合に、requireすると階層トラブルになる場合があります。
例えば、次のような階層で使っているPHPを想像してください。
/index.php
├ /view/main.php
└ /model/hallo_world.php
それぞれのファイルの中身は次のようになっています。
index.php
<?php
require_once "view/main.php";
new ViewMain();
/view/model.php
<?php
require_once dirname(__FILE__). "/../model/hello_world.php";
class ViewMain{
function __construct(){
echo HelloWorld::$value;
}
}
/model/hallo_world.php
<?php
class HelloWorld{
public static $value = "hello-world";
}
実行
hello-world
上記の中で、次のようなフィアルパスを指定する箇所があります。
require_once dirname(__FILE__). "/../model/hello_world.php";
これは、階層の違うphpを読み込む時に書く自分の居場所からの相対パスを指定する書き方なんですが、文字列に直してみてみると・・・
/var/www/html/view/../model/hello_world.php
このようになります。
汚いですね・・・
できれば、次のようにしたいところです。
/var/www/html/model/hello_world.php
最初からこのように記載しても良いのですが、サーバー内の絶対パスが変わってしまう可能性もあるので、相対階層で書きたい気持ちとのバトルが勃発します。
realpath()という便利関数があるよ
PHPには、汚い相対パスをキレイな絶対パスに変換してくれる便利機能があります。
上記のサンプルパスを変換してみると、
echo realpath(dirname(__FILE__). "/../model/hello_world.php");
こうすることで、次のような結果が得られます。
/var/www/html/model/hello_world.php
う〜ん、キレイですね。マーベラス!
realpath()関数についての解説
リファレンスページ
https://www.php.net/manual/ja/function.realpath.php
使い方
$path = "/hoge/../huga/index.php";
$response = realpath($path);
文字列の階層を送ると、整形後の絶対パスが返ってきます。
$pathがnullやブランクの場合は、現在場所の絶対パスが返ってきます。
注意点
この関数で何でもかんでも相対パスを絶対パスに変換するというわけではなく、実際にそのパス(ファイルやディレクトリ)が存在していないと、falseが返ってしまいます。
これからフォルダをmkdirしたい場合に、事前にrealpath()してしまうと、falseになってしまうので、必ずファイルやフォルダを作成後に整形を行う必要があります。
リファレンスサイトには、その点に考慮したラップ関数を載せておきますね。
function normalizePath($path) {
// realpath関数を使用してパスを正規化
$realPath = realpath($path);
// realpath関数が失敗した場合は元のパスを返す
if ($realPath === false) {
return $path;
}
return $realPath;
}
あとがき
require_onceで設定する階層なんて、実際のプログラムで見えないから、realpath()する必要なんてないじゃない!
と思った人も多いと思いますが、今回のサンプルはあくまでサンプルです。
実際は、ログデータへのパスやHTMLに出力する時の画像URLなどの場合に、汚いパスで表示するよりも、キレイなパスで表示した方がいいですからね。
(絶対パスをURLに変換する必要もありますが・・・)
そんな時に、realpath()して、キレイに見せるちょっとした技を身に着けておくことも、舞踏会に正装して参加するような感覚で、身だしなみと考えてもいいかもしれませんね。
ペチパーの身だしなみの足しにどうぞ。
0 件のコメント:
コメントを投稿