ホームページ  >  記事  >  バックエンド開発  >  phpの相対ディレクトリが開けない場合はどうすればよいでしょうか?

phpの相対ディレクトリが開けない場合はどうすればよいでしょうか?

藏色散人
藏色散人オリジナル
2022-12-01 09:25:425831ブラウズ

php が相対ディレクトリで開けない問題の解決策: 1. 「絶対パス」を使用する; 2. 一般関数 import.php を定義し、「事前にファイルを自動的にインポートする」ように設定し、 php.ini に追加します。内容を「auto_prepend_file = "C:\xampp\htdocs\auto_prepend_file.php"」に変更するだけです。

phpの相対ディレクトリが開けない場合はどうすればよいでしょうか?

このチュートリアルの動作環境: Windows 7 システム、PHP バージョン 8.1、Dell G3 コンピューター。

php 相対ディレクトリを開けませんか? PHP における require パスと 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,

I)最初はこれも相対パス Path であると考えていましたが、PHP の include/require 包含メカニズムでは、このタイプのパスは で始まる相対パス処理とは完全に異なります。 require './a.php' と require 'a.php' は異なります。

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

例 4:

A中定义  require '../b.php';   // 则B=[SITE]/app/b.php 
B中定义  require './c/c.php';  / /则C=[SITE]/app/test/c/c.php  不是 [SITE]/app/c/c.php

例 5

A中定义  require '../inc/b.php';  // 则B=[SITE]/app/inc/b.php 
B中定义  require './c/c.php';     // 则C还是=[SITE]/app/test/c/c.php  不是 [SITE]/app/inc/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|inclue はディスク上のファイルに対応します。

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/b.php
B中定义  require dirname(__FILE__).'/c.php';  // 则B=[SITE]/app/c.php

例 2

A中定义  require '../inc/b.php';              // 则B=[SITE]/app/inc/b.php
B中定义  require dirname(__FILE__).'/c.php';  // 则B=[SITE]/app/inc/c.php 始终跟B在同一个目录

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

B如果 require dirname(__FILE__).'/c.php';    // 则始终引用到跟B在同一个目录中的 c.php文件; 
B如果 require dirname(__FILE__).'/../c.php'; // 则始终引用到B文件所在目录的父目录中的 c.php文件; 
B如果 require dirname(__FILE__).'/c/c.php';  // 则始终引用到B文件所在目录的c子目录中的 c.php文件;

4。 path

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

5. 解決策

「相対パス」

の「参照ディレクトリ」は実行エントリファイルが置かれているディレクトリです "undetermined" パスも混同しやすいため、 最良の解決策は "絶対パス" を使用することです ; たとえば、b.php がどこにあるかに関係なく、b.php の内容は次のようになります。必須の場合は、b.phpのパスを参照します。 c.phpの

$dir = dirname(__FILE__);
require($dir . '../c.php');
をrequireするか、汎用関数import.phpを定義し、「事前にファイルを自動的にインポートする」に設定して、 php.ini

更改配置项(必须)auto_prepend_file = "C:\xampp\htdocs\auto_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の相対ディレクトリが開けない場合はどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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