以下は、Xinyi Network Company でプロジェクトを開発する際に得た経験の一部です
Yii フレームワークの使用時に遭遇する 3 つの問題
1. main.php ファイルへのグローバル変数の導入の問題
この問題を解決する: Yii フレームワークでは、通常、main.php がアプリケーション全体の設定ファイルとして使用され、アプリケーションのさまざまなパラメーターを保存し、配列を直接返します。使用中、main.php ファイルは Yii によって事前にロードされるため、一部のグローバル操作もこのファイルに配置されます。グローバル変数を一度追加した場合、およびグローバルを使用する場合は、一部のクラス操作をロードすることに問題はありません。他の場所でグローバル変数を取得しようとすると、どれだけ頑張っても NULL が返されることがわかりました。さまざまな試みの後、インポートされた場所をエントリファイルindex.phpに配置することで、最終的に問題を解決しました。どのような理由? Yii の main.php ファイルの読み込みを再現してみましょう。次のコード
index.php ファイル:
class CApp {
public function __construct($config) {
$config = require($config);
}
}
$path = "main.php";
$app = new CApp($path);
グローバル $global;
var_dump($global);
main.php ファイル:
$global = array(1, 2, 3);
return array();
2つのファイルを同じディレクトリに配置し、index.phpを直接実行すると、CAppのコンストラクタで$globalを直接出力すると、結果が出力されます。どのような理由?範囲の問題!
main.php ファイルで変数を定義するとき、それをグローバル変数として使用したいのに、ローカル スコープで必要になると、ローカル スコープ変数としてのみ存在します。 TIPI では、関数呼び出しにはスコープがあると述べました。このスコープ内の変数は、ネストが終了すると、変数のライフサイクルが終了します。
したがって、main.php 内のグローバル変数をアプリケーション全体のグローバル変数として使用したい場合は、エントリ ファイルのスコープ内に main.php ファイルを必要とする必要があります。
2. サードパーティの拡張機能を導入する場合の class_exists の問題
Yii フレームワーク Yii は、PHP5 のオートロード機構に基づいたクラスの自動ロード機能を提供します。自動ローダーは、YiiBase クラスの静的メソッド autoload() です。 new を使用してオブジェクトを作成したり、プログラム内のクラスの静的メンバーにアクセスしたりすると、PHP はクラス名をクラス ローダーに渡し、クラス ローダーはクラス ファイルのインクルードを完了します。しかし、サードパーティの拡張機能を導入し、そのサードパーティ拡張機能の命名規則が Yii のものと異なる場合、require XXX file failed というエラーが頻繁に表示されます。 Google で「yii Framework class_exists」を検索すると、Yii Framework の役割 Xue Qiang が、ユーザーは class_exists('MyClass', false) のようなメソッドを使用できると回答していることがわかります。
class_exists 関数は、クラスが定義されているかどうかを確認します。class_name が指すクラスが定義されている場合、この関数は TRUE を返し、そうでない場合は FALSE を返します。 PHP カーネルでは、この関数は class_name で指定されたクラスが現在のクラス テーブルに存在するかどうかを検索します。すべてのクラスは検索前に小文字に変換されるため、大文字と小文字は区別されません。 2 番目のパラメータは autoload を使用するかどうかを示します。このとき、class_exists 関数は最初に autoload を実行し、autoload の実行後にクラス テーブルの class_name が指すクラスが存在するかどうかを確認します。したがって、2 番目のパラメータを FALSE に設定することで自動ロードをバイパスできます。
これで問題は解決するかもしれませんが、変更できないサードパーティのコードを使用している場合はどうなるでしょうか?何をするか?サードパーティのオペレーションを呼び出す前に、自分でハッキングして必要なクラスをロードしただけです。
その後、別の解決策が採用されました。Yii:import の 2 番目のパラメータを直接使用して、ディレクトリ全体を強制的にロードするというものです。
3. Yii エラーログ
問題の詳細については説明しません。本番環境の構成を開発環境に移動しただけなので、エラーは表示されなくなりました。ログルールを調整したら問題ありませんでした。
Yii のエラー ログの処理は、PHP の set_error_handler 関数と set_Exception_handler 関数に依存しています。これら 2 つの関数は、CApplication の initSystemHandlers メソッドで処理されます。
この記事は、成都のウェブサイト構築に焦点を当てた信義ネットワークによって公開されています。yii の詳細については、信義ネットワークの今後のリリースにご注意ください。