web-dev-qa-db-ja.com

"themefolder/functions.php"の中に "themefolder/includes/widgets.php"が必要ですが、widgets.phpは実行されません。

物事をきれいに保つために、私はほとんど他のファイルを要求するためだけにfunctions.phpを使います。 functions.phpのそのような部分としてはこんな感じです:

#include types
require("includes/types.php");
#include shortcodes
require("includes/shortcodes.php");
#include widgetareas
require("includes/widgetareas.php");
#include paging navs
require("includes/paging-navs.php");
#include widgets
require("includes/widgets.php");

themefolder/includes/widgets.phpは次のようになります。

/*columns widget*/
require("widgets/columns-widget.php");

そして作業ウィジェットはthemefolder/includes/widgets/columns-widget.phpに書かれています。

今ここに奇妙な部分があります:このコードは壊れたりエラーを投げたりしません。それでもthemefolder/includes/widgets.phpに書かれたコードは処理されず、私のcolumns-widget.phpはロードされません。

一方、themefolder/includes/widgets.phpをthemefolder/includes/widget.phpに改名し、functions.phpの対応する行を

#include widgets
require("includes/widget.php"); 

コードは期待通りに実行され、私のcolumns-widgetがロードされます。

どうしてこれなの?これはバグですか?それとも意図された動作ですか?

PHPが相対パスを探す最初の場所はではなく、指定したファイルのインクルードファイルではなく、エントリポイントファイル(index.phpなど)に対する相対パスです。

ファイルは、指定されたファイルパス、または指定されていない場合は指定されたinclude_pathに基づいて組み込まれます。ファイルがinclude_pathに見つからない場合、includeは失敗する前に呼び出し元のスクリプト自身のディレクトリと現在の作業ディレクトリをチェックインします。

http://php.net/manual/en/function.include.php

私の推測では、あなたのコードはあなたのファイルの代わりにwp-admin/includes/widgets.phpを選びます(管理コンテキストではエントリポイントはおそらくwp-admin/index.phpです)。

常にrequire( __DIR__ . '/includes/widgets.php' );のようなインクルードを書く

8
Rarst