オブジェクト指向プログラミングは、大規模なソフトウェア プロジェクト、特に複数人が関与するプロジェクトにソリューションを提供するように設計されています。ソース コードが 10,000 行以上になると、変更のたびに望ましくない副作用が発生する可能性があります。第一次世界大戦前のヨーロッパ。
//haohappy 注: これは、モジュール間の相関関係が高すぎ、相互依存性が強すぎることを意味します。1 つのモジュールを変更すると、それに応じて他のモジュールも変更されます。
ログインを処理するモジュールが、クレジット カード処理モジュールがそのデータベース接続を共有できるようにする場合を想像してください。もちろん、その意図は良いものであり、別のデータベース接続を作成するコストが節約されます。ただし、場合によっては、ログイン処理モジュールがデータベース接続の 1 つを変更することがあります。変数の名前によって両者の間の合意が分断される可能性があり、クレジット カード モジュールの処理でエラーが発生し、その結果、請求書を処理するモジュールでエラーが発生する可能性があります。間もなく、システム内のすべての無関係なモジュールでエラーが発生する可能性があります。このため
、ほとんどのプログラマは、結合とカプセル化に感謝しており、結合は 2 つのモジュール間の依存度の尺度であるほど良いと考えています。既存のプロジェクトを別のプロジェクトで使用する
他のモジュールへの影響を気にせずに、特定のモジュール内で大規模な変更を加えたい場合にも、モジュールがこのソリューションを提供すると考えられます。比較的独立しており、モジュール間のデータ通信はインターフェイスを介して行われます。モジュールは互いの変数名を覗き見せず、関数を介して丁寧にリクエストを送信します。
カプセル化は、あらゆる PHP および多くの手続き型言語で使用できる原則です。オブジェクト
指向プログラミングでは、モジュールはオブジェクトに編成されます。抽象的な観点から見ると、メソッドはオブジェクトの動作であり、プログラミングの観点からは、メソッドは関数であり、プロパティは変数です。指向性システムでは、各部分はオブジェクトで構成され、
クラスはオブジェクトのプロパティを定義します。クッキー オブジェクトのセットを作成する場合、クラスはクッキー マシンになります。クラスのプロパティとメソッドはメンバーと呼ばれ、
各言語は C++ の借用概念に基づいてオブジェクトにアクセスするためのさまざまな方法を提供し、その下に関数や変数を含めるデータ型を提供します。識別子。 PHP が最初に設計されたとき、そして PHP3 が開発されたときでさえ、PHP はコード 100,000 行を超える大規模プロジェクトを開発する機能を提供することを目的としていませんでした。 PHP や Zend エンジンの発展により、大規模なプロジェクトを開発できるようになりましたが、プロジェクトがどれほど大きくても、クラス内にスクリプトを記述すればコードを再利用できます。これは、特に自分のコードを他の人と共有したい場合には良いアイデアです。
オブジェクトの考え方は、コンピューター サイエンスの中で最も興味深い概念の 1 つです。最初はそれをマスターするのは難しいですが、一度マスターすれば、心で考えることが非常に自然に感じられるようになるでしょう。
PHP5 のオブジェクト モデル
PHP5 には、単一継承、制限付きアクセス、およびオーバーロード可能なオブジェクト モデルがあります。「継承」については、この章で後ほど詳しく説明します。さらに、PHP はクラス間の属性と制限付きアクセスをサポートします。最後に、PHP では、サブクラスがその親クラスからのメンバーをオーバーロードすることができます。これは、
PHP では必要ありません。参照ベースのオブジェクト モデルについては、この章の最後で詳しく説明します。これ
は、より直接的なものであり、効率が向上します。
以前のバージョンの PHP では、スクリプトはデフォルトでオブジェクトをコピーしていましたが、
PHP 5 ではオブジェクト システムの不要なコピーが回避されるため、スクリプトの実行効率が向上しました。複雑さが増すと同時に、実行効率にもメリットがもたらされます。同時に、コピーが削減されると、確保できるメモリが減り、他の操作のためにより多くのメモリが解放され、効率も向上します
。嬉しい開発は、オブジェクトが破棄される前にクラスメソッドを破棄実行できるようにすることです。これは、オブジェクトへの参照が存在しないことを PHP が明確に認識し、空きメモリを割り当てることができるため、非常に有益です。
PHP5 のメモリ管理
オブジェクトの転送
PHP5 は Zend Engine II を使用しており、オブジェクトは他の一般変数のように Zval に保存されません (PHP4 では、オブジェクトは一般変数と
同様に Zval に保存されます)。 )。 Zval には、オブジェクトの内容 (値) ではなく、オブジェクトのポインタのみが格納されます。オブジェクトをコピーする場合、またはオブジェクトをパラメーターとして関数に渡す場合、データをコピーする必要はありません。同じオブジェクト ポインターを保持し、この特定のオブジェクトが別の zval を介してポイントしていることをオブジェクト ストアに通知するだけです。オブジェクト自体はオブジェクト ストアに配置されているため、オブジェクトに加えた変更は、そのオブジェクトへのポインタを保持するすべての zval 構造体に影響します。これは、ターゲット オブジェクトに対する変更がソース オブジェクトに影響するため、プログラムに明示されています。これにより、PHP オブジェクトは常に参照によって渡されるように見えるため、PHP のオブジェクトはデフォルトで「参照」によって渡され、PHP4 のように & を使用してオブジェクトを宣言する必要がなくなりました。
一部の言語 (最も一般的な C) のガベージ コレクション メカニズム
では、データ構造の作成時に明示的にメモリ割り当てを要求する必要があります。メモリを割り当てたら、情報を変数に保存できます。同時に、マシンが他の変数用にメモリを解放し、メモリ不足を回避できるように、変数の使用が終了したらメモリを解放する必要もあります。
PHP は自動的にメモリを管理し、不要になったオブジェクトを消去します。 PHP は、参照カウントと呼ばれる単純なガベージ コレクション メカニズムを使用します。各オブジェクトには参照カウンタが含まれており、オブジェクトに接続されている参照ごとにカウンタが 1 ずつ増加します。参照がリビング スペースから出るか、NULL に設定されると、カウンターは 1 ずつ減らされます。オブジェクトの参照カウンタがゼロになると、PHP はそのオブジェクトを使用する必要がなくなったことを認識し、そのオブジェクトが占有しているメモリ領域を解放します。
例:
<?php
クラス人{}
関数 sendEmailTo(){}
$haohappy = 新しい人( );
// 新しいオブジェクトを作成します: 参照カウント 参照カウント = 1
$haohappy2 = $haohappy;
// 参照によるコピー: 参照数 = 2
設定を解除($haohappy);
// 参照を削除します: 参照数 = 1
sendEmailTo($haohappy2);
// オブジェクトを参照渡しします。
// 関数の実行中:
// 参照カウント = 2
//実行後:
// 参照数 = 1
unset($haohappy2);
// 参照の削除: 参照数 = 0 メモリ空間を自動的に解放します
?>