/ /インクルードファイルのグローバル変数にアクセスできません-php、include、scope、global-variables

インクルードされたファイルのグローバル変数にアクセスできません - php、include、scope、グローバル変数

スコープに予期しない問題があります。の include ドキュメンテーション (にも適用されます require_once)必要なファイルは、必要な行のすべての変数にアクセスする必要があると言います。

何らかの理由で、必要な関数内のグローバルスコープでインスタンス化されたクラスにアクセスできません。

誰もが理由を知っていますか?私は明らかに何かが欠けています。

私はそれを参照して動作させました $GLOBALS[]、しかし、なぜそれが機能しないのかを知りたい。

更新:
私が得ているエラーは次のとおりです。

Fatal error: Call to a member function isAdmin() on a non-object in <path>.php on <line>

コード:

$newClass = new myClass();

require_once("path to my file");

----- inside required file -----
function someFunction() {
$newClass->someMethod(); // gives fatal error. (see above).
}

回答:

回答№1の場合は3

関数は新しいスコープを定義するため、関数内ではグローバルスコープの変数にアクセスできません。

可変スコープ

ユーザー定義関数内でローカル 関数スコープが導入されました。どれか 関数内で使用される変数は デフォルトはローカル関数に限定 範囲

含まれるファイルについて、 手動状態

ファイルが含まれている場合、それをコーディングします 含むは、変数スコープを継承します インクルードする行の 発生します。

したがって、関数に何かを含めると、含まれるファイルのスコープは関数のスコープになります。

更新: 質問に編集されたコード例を見て、 global $newClass; 関数の最初の行で機能するはずです。

$newClass = new myClass();
require_once("path to my file");

----- inside required file -----
function someFunction() {
global $newClass;
$newClass->someMethod();
}

ただし、 global コードをすぐに難しくする可能性があります維持します。グローバルスコープに依存しないでください。オブジェクトをパラメーターとして関数に渡すか、Singleton / Registryクラスを使用できます(後者に反論する傾向がありますが、場合によってはよりクリーンなソリューションになります)。


回答№2については2

含まれるコードには、それを取り巻くコードとは異なるスコープがありません。例:

function a() {
echo $b;
}

これでも失敗します echo $b 含まれているファイルにあります。上記を次のように置き換えた場合:

function a() {
include "file.php";
}

...と file.php 含まれるもの:

echo $b;

...そして、それはあなたが書いたのと同じことです:

function a() {
echo $b;
}

このように考えてください:使用するときはいつでも include / require、含まれているファイルの内容は、 include / require ステートメントを削除し、その場所にファイルの内容を貼り付けたかのように、ステートメント。

スコープに関する限り、他のことは何も行いません。