スコープに予期しない問題があります。の 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
ステートメントを削除し、その場所にファイルの内容を貼り付けたかのように、ステートメント。
スコープに関する限り、他のことは何も行いません。