2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

初心者がherokuでrequire_onceしたときに困った話

Last updated at Posted at 2018-10-30

どう困ったのか?

本当に初歩的なことだとは思いますがたとえば、下のようなファイル構造になっているとき

  • test.php
  • testfile
    • hoge.php
test.php
<?php
require_once ("./testfile/hoge.php"); //'testfile'というファイルの'hoge.php'を読み込む

echo $test; //'$test'は'hoge.php'から得る
?>
hoge.php
<?php
$test = 'hogehoge'; //'$test'に「hogehoge」を格納する
?>

##ローカル環境で'test.php'を実行すると

$ php test.php
//hogehoge

このように、正常に読み込まれ実行されます。

##Herokuの環境で実行すると

Herokuの環境で実行してみると**'hoge.php'が読み込まれません**。
ファイルの階層もチェックし、ローカルと同じ状態になっているにも関わらずです。

これが無理なら、相対パスでなく絶対パスでファイルにアクセスしてみようと試みました。

##相対パスから絶対パスへ
'index.php'につぎのようなプログラムを実行させ、絶対パスを調べました。

index.php
<?php
echo __DIR__;
//「/app/index.php」と出力された
?>

これを参考に'test.php'のコードを次のように書き換えました。

after__test.php
require_once ("/app/testfile/hoge.php"); // '.'を削除し、'/app'を先頭に追加

echo $test;
?>

##再度、Herokuの環境で実行
書き換えたあと、再びデプロイして実行すると、読み込まれませんでした。。
絶対パスが間違えているのかと思い、ファイルの階層構造を念入りに調べましたが、
絶対パスが間違っていないことがわかっただけで読み込むための手掛かりは得られませんでした。

#解決策
ここで、ふと思いつきました。
DIRをそのままrequire_onceの構文に入れてみたら、うまいこといくのでは?と。

test.php
<?php
require_once __DIR__ . ("/testfile/hoge.php") // '/app'を削除し、'__DIR__ .'を追加

echo $test;
?>

このように書き換え実行すると、正常に読み込まれました!

なぜ、直接絶対パスを書いた場合では読み込まずに、DIRをもちいると読み込むのかは初心者の私にはわかりませんでした。
(たぶん、詳しい人がコメントしてくれるのでそれを参考に追記します。)

#結論
DIRを積極的に使おう!
DIRを用いれば違う環境で使用するときに、パスの書き換えの必要が(ほとんど)なくなると思います。
そして、今回のように困ることやエラーも減る要因になると思います。

ここまで読んでいただき、ありがとうございました。

2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?