/*************************************************** * ****** 翻訳: midiguy 翻訳の間違いをご指摘ください E-Mail: midiguy@263.net QQ: 5149927 ********************* * ************************************/ オブジェクト指向プログラミングの起源は、電話や車などのオブジェクトについての人々の考え方に由来します。多くのプログラマは、オブジェクト指向プログラミングについて議論するときに「パッケージ化」や「継承」などの言葉を好んで使いますが、これらはほとんどの人を混乱させます。オブジェクト指向の概念を自然物と結び付けて、その原理を理解することができます。交通機関を例に挙げてみましょう。 設計図 車両を製造するには設計図が必要です。この設計図では、車両のホイールの数、色などを定義できます。車両は特定の属性と動作によって定義されます。 PHP では、これらのプロパティと動作を変数とメソッド (関数) と呼びます。オブジェクトを記述する変数とメソッドのセットが「クラス」を構成します。 拡大設計図 車、自転車、バイクなど乗り物には様々な種類がありますので。一般的な交通手段を使いながら、さまざまな交通手段に新たな機能を付加できる方法が必要です。つまり、「クローラー」はあらゆる交通手段で使用する必要があるため、新たな機能を追加する必要がありません。 -このメソッドを書きます。この機能を「継承」して完成させることができます。 「vehicle」クラスを継承するクラス「car」を作成すると、「vehicle」クラス内のすべてのメソッドが「car」クラスに継承されます。 抽象化 抽象化の目的は、複雑なオブジェクトのプロパティの一部にのみ焦点を当てることです。問題を解決するには、洗練されたオブジェクトを構築する必要があります。車の何千もの属性を簡単に取得できますが、自動車ディーラーのディレクトリを保存するプログラムを設計する必要がある場合、必要なのは 10 程度の属性のサブセットだけです。このような車は、プログラムでの使用に適した車オブジェクトに抽象化されます。 ラッピング ラッピングは、ツール メカニズムから一連のメソッドの内容を隠し、明確に定義されたインターフェイスのみをユーザーに提供します。オブジェクト指向プログラミングでは、パッケージ化によりオブジェクトのデータ構造とメソッドが結合されます。 「パッケージング」を理解する最も簡単な方法は、電話を例に挙げることです。今日の消費者はさまざまな電話機を購入でき、これらの電話機の内部設計は異なる場合がありますが、これらの電話機はすべて、標準の共通インターフェイスを介して通信できます。これは、クラスで新しいデータ型を定義できるというパッケージ化の考え方です。 PHP自体には文字列変数や浮動小数点型変数などの変数型があります。ただし、クラスを通じて、船舶、ユーザー リファレンス マニュアル、データベースなどの独自のデータ タイプを設計できます。クラスは、このデータ型のプロパティと動作 (メンバー変数とメソッド) を定義します。次の例は、プロパティとメソッドを含むクラスを定義する方法を示しています。 私たちの車両の実際の例を見てみましょう ----------車両クラス------------ property1 = "フォード SUV である必要があります" } } function color( $col) { $this->property2 = $col; } ?> 定義されたクラスの使用方法 クラスが定義されたら、そのインスタンスを作成できます。先ほどの例を使用するには、以下の「Vehicle」クラスのインスタンスを作成します。 settires("Firestone"); ?> クラスからの変数の使用 最大の違いは、オブジェクトとそのオブジェクトが持つ値のタイプを操作することです。文字列変数は値を持つので理解しやすいです。 $myStr = "PHP は...うーん、忘れました"; ただし、オブジェクトには任意の値を指定できます $myCar->year = 1988; $myCar->hasAirbag = false; $myCar->color = "ツルニチニチソウ"; PHP では、オブジェクトのすべてのメンバー変数はデフォルトでパブリックです。オブジェクトのプロパティへのアクセスを強制する方法はありませんが、変数をプライベートにしたい場合は、強調した方法でアクセスすることができます。 $this ポインター オブジェクトのメソッドを呼び出したい場合は、$this を使用して、このオブジェクトの指定されたインスタンスのメンバー変数を呼び出すことができます。最初は理解できないかもしれません。例を見てみましょう。まず、2 台の車があると想像してください。 $myCar = new vehicle(); $spousesCar = new vehicle(); これで、同じクラスの 2 つのオブジェクトができました。 「同じユーザー定義変数タイプの 2 つの複合変数ができました」という言葉を聞いたことがあるかもしれません。これらは、同じ OOP 概念を別の方法で表現したものにすぎません。$myCar と $spousesCar の各変数には、このクラスからの独立したプロパティ セットがあります。 $myCar->property1; //これら 2 つは異なります $spousesCar->property1; //property1 はクラス定義に 1 回しか現れません。新しいデータ型を形成することのみを目的として設計されていることを理解する必要があります。 ただし、このクラスには settires() 関数が 1 つだけあります。次のステートメントを使用する場合、誰がそれを呼び出したかはどのようにしてわかるのでしょうか? $myCar->settires("Firestone"); はは、$this は機能します。指定されたオブジェクトがクラス内の関数を呼び出すと、そのオブジェクトはパラメーターとして自動的に渡されます。 $this は便宜上使用されています。以下の例を見てください。理解できるはずです。 $myCar->settires("Firestone"); /* **メソッド*/ function settires($type) { if ($type == "Firestone") { $this->property1 = "フォード SUV である必要があります"; } } //$this は $myCar 変数を表します $spousesCar->settires("Goodyear"); /* ** メソッド*/ function settires($type) { if ($type == "Firestone") { $this- > property1 = "Ford SUV である必要があります"; } } //これは $spousesCar を表します。開発者が呼び出せる「デフォルト」関数を必要とする場合は、コンストラクターを作成します。これどうやってやるの?これは「コンストラクター」を使用するためです。実際には、コンストラクターの名前をクラスの名前として定義するだけで実現できます。これで、このクラスのオブジェクトを作成するたびに、このコンストラクター メソッドが呼び出されます。 クラスの継承 クラスは別のクラスを継承できると述べましたが、システムでは多くの変数が同じ役割を果たしますが、継承は非常に便利です。継承は、別のクラスをテンプレートとして使用して、クラスがそれ自体を構築できる方法です。継承クラスは、継承クラスで定義されているメンバ変数とメソッドを継承します。拡張または継承されたクラスはサブクラスと呼ばれます。継承されるクラスをスーパークラスまたは親クラスと呼びます。これにより、既存のコードに影響を与えることなく、クラスが別の方法で機能できるようになります。次に、例を見てみましょう。クラス Airplane { var $tirePressure; var $passengerLimit; function takeOff() { ... } function land() {} } class sevenFortySeven extends Airplane { function preFlightCheck() //747 航空機の離陸準備作業} } class biplane extends Airplane { function preFlightCheck() { //複葉機の離陸準備作業} } $planeArray[] = new biplane() = new sevenFortySeven(); ] = new sevenFortySeven(); $planeArray[] = new biplane(); for ($x = 0; $x preFlightCheck() ) { $currentPlane->takeOff(); , 離陸しようとしていることはすべてわかります。} else { print "飛行機に問題があります。" } } クラスの静的メソッド クラスのオブジェクトを扱うとき、便利な関数を置くことができます。別の特別なクラスを作成する代わりに、クラス内のこのオブジェクトに対して。このような関数は静的メソッドと呼ばれます。優れたクラスには、すべての有用な (ユーティリティ) 関数が含まれている必要があります。 class Money { function addTax($amount,$percent){ return $amount + ($amount * $percent) } function ConvertCurrency ($amount, $from, $to) { //データベース内の $from からの換算を検索します。 $to return $amount * $rate; } } $total = Money::addTax($subtotal,6.5); $yen = Money::convertCurrency ($usd, "america", "japan"); (ファクトリ メソッド) コードをいくつかのチャンクに分割してオブジェクトを作成すると有益な場合があります。多数のクラスを使用したり、クラスを使用してファクトリ メソッド (ファクトリ メソッド) を使用するオブジェクトを決定したりできます。 ファクトリ クラスは、コードを効果的に整理するのに役立ちます。通常、ファクトリ クラスには比較的大きな変換宣言が含まれており、適切なオブジェクトのインスタンスを返します。 Cスキャナーを使用した例を見てみましょう。基本的な Item クラスがありますが、さまざまな製品 (電子機器、衣料品など) に対して呼び出すことができるサブクラスも多数あります。 Class Item { var $price; var $properties; function getNewItem($upc) { //$upc のタイプを見つけて、それを $type 変数に入れます。 // $upc そしてそれを $attrib 変数に入れます; return new $type($attrib); } } class create extends item { function generated ($a) { $this->properties = $a; return true ; } } クラス ハードライン 拡張項目 { 関数 ハードライン ($a) { $this->properties = $a; } 関数 requireSclae() { return false; } while ( $upc = $scanner->next_code() ) / /スキャナークラスがあると仮定します $z = Item::getNewItem($upc); if ($z->requiresScale() ) { echo "サイズが必要です!" } $subtotal += $z->properties["価格"]; }