PHP ファイル名の指定で、マジカル定数を使用


PHPでファイル名を指定する場合は、なるべくマジカル定数 __DIR__ などと組み合わせた方が良いです。

マジカル定数を使わない場合

例として
フォルダ・ファイル構成が
public_html
┣ folder1
┃ ┗ test1.php  (呼び出される側)
┗ folser2
┗ main.php  (呼び出す側)

 

<?php // test1.php
  $array1 = array(
    '0' => "abcd",
    '1' => "XYZ"
  );
?>
<?php // main.php
equire_once("../folder1/test1.php") ;

print_r($array1);

?>

これでmain.phpを実行すると、以下の結果で問題ありません。

ここで、このmain.phpを読み込むmaster.phpを作ります。

フォルダ・ファイル構成が
public_html
┣ folder1
┃ ┗ test1.php  (呼び出される側)
┣ folser2
┃ ┗ main.php  (呼び出される側)
maseter.php

<?php // master.php
require_once("folder2/main.php") ;

?>

このmaster.phpを実行すると、以下のようなエラーになってしまいます。

folder1のtest1.phpが見つからないことになってしまいます。

マジカル定数を使ってないと、全て起点が読み出し元のファルダ位置となってしまうのでこの様なエラーが起きてしまいます。

 

マジカル定数を使って解決する

上のエラーが起きてしまう例で、
「equire_once」でファイル指定している部分をマジカル定数「__DIR__」と組み合わせて指定するように変更します

main.phpとmaster.phpが該当するので変更(master.phpは今回のエラー対象ではないのですが一応変更)

<?php // main.php 変更後
equire_once(__DIR__."/../folder1/test1.php") ;

print_r($array1);

?>
<?php // master.php 変更後
require_once(__DIR__."/folder2/main.php") ;

?>

main.phpの実行!以下の通り問題なし

master.phpの実行!想定通りの動作でエラーは解決しています。

マジカル定数「__DIR__」を使用したファイルの指定方法

呼び出し側をmain.php、呼び出される側をtest1.phpとするとして、
フォルダ・ファイル構成により変化します。全て呼び出す側のファイルがあるフォルダを起点として考えます。

同一フォルダにある場合

フォルダ・ファイル構成が
public_html
┣ test1.php  (呼び出される側)
┗ main.php  (呼び出す側)

<?php // main.php
equire_once(__DIR__."/test1.php") ;

?>


この様になります。

サブフォルダの場合

フォルダ・ファイル構成が
public_html
┣ folder1
┃ ┗ test1.php  (呼び出される側)
┗ main.php  (呼び出す側)

<?php // main.php
equire_once(__DIR__."/folder1/test1.php") ;

?>

この様にmain.phpの位置からサブフォルダ→test1.phpになります。

まったく異なるフォルダの場合

フォルダ・ファイル構成が
public_html
┣ folder1
┃ ┗ test1.php  (呼び出される側)
┗ folser2
┗ main.php  (呼び出す側)

<?php // main.php
equire_once(__DIR__."/../folder1/test1.php") ;

?>


現在の位置(main.phpの位置)から1つ上のフォルダ(public_html)にあるfolder1の中のtest1.phpと言う指定になります。

これが2つ上のフォルダなら

<?php // main.php
equire_once(__DIR__."/../../folder1/test1.php") ;

?>

「__DIR__.”/../../~」

これが3つ上のフォルダなら

<?php // main.php
equire_once(__DIR__."/../../../folder1/test1.php") ;

?>

「__DIR__.”/../../../~」

になります。