ホームページ >バックエンド開発 >PHPチュートリアル >PHP: パスの要求とインクルードの問題

PHP: パスの要求とインクルードの問題

黄舟
黄舟オリジナル
2017-06-25 10:35:391476ブラウズ

FILE は前処理された変数であり、実行前に処理され、ファイルがインクルードされる前に置換されています。
include を必要とするファイルの内容は実行時に処理され、そのコードは include ファイル の空間 (インクルード ファイルを基準とした相対パス) で実行されます。

1 絶対パス、相対パス、未定パ​​ス

相対パス

相対パスとは、

./a/a.php (カレントディレクトリからの相対パス)

../common のように、.で始まるパスを指します。 .inc.php (上位ディレクトリからの相対パス)、

絶対パス

絶対パスは、/ で始まるパス、または Windows の C:/ に似たドライブ文字で、最終アドレスを一意に決定できます。参照パスのないファイル。 例:

/apache/wwwroot/site/a/a.php

c:/wwwroot/site/a/a.php

未決定のパス

または / で始まらないもの、または Windows ではないもの。ドライブ文字 :/ で始まるパス (

a/a.php

common.inc.php、

など) は当初、これも相対パスであると考えていましたが、PHP の include/require 包含メカニズムでは、このタイプのパスは先頭の相対パスの扱いが全く異なります。 require './a.php' と require 'a.php' は異なります。

これら 3 種類のインクルード パスの処理方法を分析してみましょう: まず、結論を覚えておいてください。インクルード パスが相対パスまたは絶対パスの場合、include_path (php.ini で定義されている include_path 環境変数) には進みません。 、またはプログラム内で

set_include_path(...) を使用してファイルを見つけます。

テスト環境の説明

注: 以下の議論と結論はこの環境に基づいています: A=http://www.xxx.com/app/test/a.php と仮定します。次の議論が直接的なものであることを再度強調します。 A ケースにアクセスします。

2. 相対パス:

インクルード解析では、ネストされた包含レベルに関係なく、この参照ディレクトリがプログラムを実行するディレクトリになります。エントリーファイル

があります。 例 1

A は require './b/b.php' を定義します // 次に B=[SITE]/app/test/b/b.php

B は require './c.php' を定義します / / 次に、C=[SITE]/app/test/c.php は [SITE]/app/test/b/c.php ではありません



例 2

A は require './b/b.php ' を定義します。 // B=[SITE]/app/test/b/b.php

B は require '../c.php' を要求します // C=[SITE]/app/c.php は [ SITE] ではありません; /app/test/c.php




例 3

A は require '../b.php' を定義します //次に B=[SITE]/app/b.php

B は require '../ c.php'; //C=[SITE]/app/c.php は [SITE]/c.php ではありません


A は require '../b. / 次に B=[SITE]/app/b.php
B は require './c/c.php' を要求します // 次に C=[SITE]/app/test/c/c.php Not [SITE]/ app/c/c.php

例 5


A は require '../inc/b.php' を定義します // B=[SITE]/app/inc/b を定義します
B は require ' ./c/c.php'; // その場合、C は [SITE]/app/inc/c/c.php ではなく =[SITE]/app/test/c/c.php になります

例 6


A は require '../inc/b.php' を定義します // 次に B=[SITE]/app/inc/b.php
B は require './c.php' を定義します // 次に C=[SITE] /app/test/c.php は [SITE]/app/inc/c.php ではありません

3. 絶対パス


絶対パスは比較的単純で、混乱やエラーを引き起こしにくいです。ディスク上のファイルに。

require '/wwwroot/xxx.com/app/test/b.php'; // Linux の場合

require 'c:/wwwroot/xxx.com/app/test/b.php' // Windows の場合

dirname

(FILE) も絶対パスの形式でディレクトリとして計算されますが、FILE は Magic の定数であり、このステートメントが記述されている PHP ファイルの絶対パスと等しいことに注意してください。したがって、 dirname(FILE ) は常に、このステートメントが記述される php ファイルの絶対パスを指し、そのファイルがインクルードされているかどうか、他のファイルによって使用されているかどうかには関係ありません。

例 1

A は require '../b.php' を定義します // 次に B=[SITE]/app/c.php

例 2

A で require '../inc/b.php'; を定義する / すると、B=[SITE]/app/inc/c.php は常に B と同じディレクトリにあります

結論: B が含まれているかどうかは関係ありませんA によって使用されるか、直接アクセスされます

B if require dirname(FILE).' /c.php'; // 常に B と同じディレクトリ内の c.php ファイルを参照します。 ).'/../c.php'; // 常に B ファイルが配置されているディレクトリの親ディレクトリにある c.php ファイルを参照します

BIf require dirname(FILE).'/c/c .php'; // B ファイルが配置されているディレクトリの c サブディレクトリ内の c を常に参照します。 php file;


まず、 include_path で定義された include ディレクトリを使用して [不明なパス] を 1 つずつ実行します。既存のファイルが見つかった場合は、それを含めて正常に終了します。見つからない場合は、require ステートメントを使用して実行します。php ファイルが配置されているディレクトリは、[ で構成されるフル パスを連結するために使用されます。ファイルが存在する場合、インクルード ファイルは正常に終了します。そうでない場合は、インクルード ファイルが存在しないことを意味し、エラーが発生します。 未決定のパスは混乱しやすいため、お勧めできません。

5. 解決策

「相対パス」の「参照ディレクトリ」は実行エントリファイルが存在するディレクトリであり、「未定」のパスも混同しやすいため、「絶対パス」を使用するのが最善の解決策です。 "; たとえば、b.php の内容は次のとおりです。b.php がどこに必要であっても、b.php のパスは c.php を必要とする参照として使用されます。

$dir = dirname(FILE);

require($dir . '../ c.php');

または汎用関数import.phpを定義し、「事前にファイルを自動インポートする」に設定し、php.iniで以下の設定を行う

設定項目の変更(必須) auto_prepend_file = "C:xampphtdocsauto_prepend_file .php"

設定項目の変更(任意)allow_url_include = On

import.phpの内容は以下の通りです

function import($path) {    
    $old_dir = getcwd();        // 保存原“参照目录”
    chdir(dirname(FILE));    // 将“参照目录”更改为当前脚本的绝对路径
    require_once($path);
    chdir($old_dir);            // 改回原“参照目录”
}

このようにして、import( ) 関数を使用してファイルを要求します。ファイルに含まれる「参照ディレクトリ」のレベルが何であっても、それは現在のファイルです。

以上がPHP: パスの要求とインクルードの問題の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。