ホームページ  >  記事  >  バックエンド開発  >  Yii Framework_PHP チュートリアルを使用する際に発生する 3 つの関連する問題

Yii Framework_PHP チュートリアルを使用する際に発生する 3 つの関連する問題

WBOY
WBOYオリジナル
2016-07-13 10:29:49920ブラウズ

以下は、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 の詳細については、信義ネットワークの今後のリリースにご注意ください。

http://www.bkjia.com/PHPjc/770157.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/770157.html技術記事以下は、Xinyi Network Company でのプロジェクト開発時の経験に基づいて、Yii フレームワークで遭遇した 3 つの問題の一部です: 1. main.php ファイルにグローバル変数を導入する問題が復元されました...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。