LoginSignup
8
7

More than 3 years have passed since last update.

require_onceでファイルの読み込み、色々あるけど結局どう書けばいいのか

Last updated at Posted at 2019-05-23

結論

index.php
require_once __DIR__.'/foo/A.php';

これが一番てっとり早くて、設定による差異もなさそう。

そのファイルの存在するディレクトリ。include の中で使用すると、 インクルードされるファイルの存在するディレクトリを返します。 つまり、これは dirname(__FILE__) と同じ意味です。 ルートディレクトリである場合を除き、ディレクトリ名の末尾にスラッシュはつきません。

ディレクトリ構成

/src/をドキュメントルートに指定している想定

src/
  foo/
   A.php
   B.php
  index.php

相対パスでの指定

A.php
require_once 'B.php';
index.php
require_once 'foo/A.php';

相対パスでもindex.phpからA.phpを読み込むことは可能ですが、
A.phpで同じく相対パスを使ってB.phpを読み込んでいた場合エラーになります。

相対パスで記述した場合はPHPファイルを実行したファイルがある位置からの相対パス、
つまりこの場合であればsrc/foo/B.phpではなく、存在しないsrc/B.phpをよんでいることになります。

ドキュメントルートからの指定

index.php
require_once $_SERVER['DOCUMENT_ROOT'].'/foo/A.php';

現在実行されているスクリプトが存在するドキュメントルート ディレクトリです。サーバーのコンフィグレーションファイルで 定義されています。

$_SERVER['DOCUMENT_ROOT']はApacheの場合httpd.confで設定されています。
ローカルと本番環境など設定によっては差異があることがあります。

サーバーのルートからの指定

index.php
require_once '/var/www/html/src/foo/A.php';

ドキュメントルートとサーバーのルートは別物です。
現在は/src/をドキュメントルートに設定しているという想定ですが、
サーバーのルートからパスを指定する場合はドキュメントルートより上のディレクトリも記述しないといけません。
/var/www/html/はサーバーの設定によって異なります。

include_pathでの指定

index.php
require_once 'foo/A.php';

ファイルのインクルードは、指定されたパスから行います。パスを指定しない場合は、 include_path の設定を利用します。 ファイルが include_path に見つからないときは、include は呼び出し元スクリプトのディレクトリと現在の作業ディレクトリも探します。

相対パスと同じ記述方法ですが、include_pathが設定されている場合、include_pathから先にファイルを探してくれるようです。
include_pathはphp.iniや.htaccess、set_include_path関数などで設定できます。

dirname(__FILE__)での指定

__DIR__と同じ意味です。

__DIR__が追加されたのが5.3.0以降なのでそれ以前のバージョンではこちらを使用します。

5.3.0 __DIR__ と __NAMESPACE__ が追加されました。

以下余談

include, requireの違い

処理失敗時にエラーを発するか、警告を発するか。

require : エラー(処理がストップする)
include : 警告(処理は続行)

require_onceとrequireの違い

require_onceは一度しか呼び出さない。

foo.php
$foo = 1;
bar.php
$bar = 1;
index.php
require_once 'foo.php';
$foo ++;
var_dump($foo);  // 2

/*
  foo.phpは一度しか呼び出されないので$fooが初期化されない
*/
require_once 'foo.php';
var_dump($foo);  // 2


require 'bar.php';
$bar ++;
var_dump($bar);  // 2

/*
  bar.phpがもう一度呼び出されるのでbar.phpが初期化される
*/
require 'bar.php';
var_dump($bar);  // 1

オートローダを使う

いちいちrequire_onceを記述するのも面倒なのでオートローダを使った方が良さそう。
オートローダーはspl_autoload_registerを使って自作することもできますが、
Composerを使うのが楽でよさそうです。

Composerでautoload.phpを作成する

参考

【PHP】include, requireの安全なパスの書き方と違い
【PHP】include, requireの違いと使い分け

8
7
0

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
8
7