たけるのプログラミング

作ったものとか、気ままにアップします。

【PHP】require_once関数でエラーになった件


↑tatum.phpはCelticsフォルダの中にあります。
上記ような構成のアプリケーションがあり、実行ファイルをindex.phpとする。

それぞれのコードの内容

index.php

<?php
require_once('Lakers/lebron.php');
hello();
?>

lebron.php

<?php
require_once('../Celtics/tatum.php');

tatum.php

<?php
function hello()
{
echo 'hello';    
}
?>

上記コードでindex.phpを実行するとエラーとなる。
エラーとなる原因はrequire_onceのパスの指定の仕方とPHPの仕様にある。

PHPは実行ファイル(index.php)のディレクトリ位置を基準として、requireを行うのでlebron.phpのrequire_onceのパスは

testing_php/../Celtics/tatum.php となり、当然そのディレクトリにはtatum.phpが存在しないのでエラーとなる。

解決方法

__DIR__ を使う。PHPでは__DIR__というマジカル定数が用意されています。
PHP: マジック定数 - Manual
PHPドキュメントによると

include の中で使用すると、 インクルードされるファイルの存在するディレクトリを返します。

つまり実行ファイルの影響を受けず、パスを指定することができる。
例えばlebron.phpの中で__dir__は

/var/www/html/Lakers

となり /から始まっているパスなので絶対パスになっていることが分かる。

なのでlebron.phpを以下のように変えればエラーが発生せずに実行を行うことができる。

<?php
require_once(__DIR__.'/../Celtics/tatum.php');