オブジェクト指向
オブジェクト指向プログラミング (OOP、オブジェクト指向プログラミング) は、コンピューター プログラミング アーキテクチャです。OOP の基本原理の 1 つは、コンピューター プログラムが、OOP の 3 つの目標(biāo)を達(dá)成するための単一のユニットまたはオブジェクトで構(gòu)成されることです。ソフトウェア エンジニアリングの重要な點(diǎn)は、再利用性、柔軟性、拡張性です。全體的な操作を?qū)g現(xiàn)するために、各オブジェクトは情報(bào)を受信し、データを処理し、他のオブジェクトに情報(bào)を送信できます。オブジェクト指向はソフトウェア開発の分野で常に注目されています。まず第一に、オブジェクト指向は人間の物の見方の一般的なルールと一致しています。第二に、オブジェクト指向の手法を使用することで、システムの各部分がそれぞれの役割を果たし、任務(wù)を遂行できるようになります。これにより、プログラマーは、よりシンプルで保守が容易で再利用可能なコードを作成できるようになります。 PHP は真のオブジェクト指向言語ではないという人もいますが、これは事実です。 PHP はハイブリッド言語であり、OOP または従來の手続き型プログラミングを使用できます。ただし、大規(guī)模なプロジェクトの場(chǎng)合は、純粋な OOP を使用して PHP でクラスを宣言し、プロジェクト內(nèi)でオブジェクトとクラスのみを使用する必要がある場(chǎng)合があります。この概念については詳しく説明しません。なぜなら、多くの人や友人がオブジェクト指向プログラミングから遠(yuǎn)ざかる主な理由は、オブジェクト指向プログラミングに觸れても理解できないため、學(xué)びたくないからです。読者が全體の內(nèi)容を理解するまで待ちます。
オブジェクト指向を?qū)Wぶので、まずプロセス指向とは何かを理解しましょう。
手続き指向
「手続き指向」とは、プロセス中心のプログラミングの考え方です。 「プロセス指向」は、「レコード指向」プログラミングのアイデアとも呼ばれます。これらは、豊富な「オブジェクト指向」機(jī)能 (継承、ポリモーフィズムなど) をサポートせず、永続狀態(tài)とドメイン ロジックの混合を許可しません。
問題を解決するために必要な手順を分析し、関數(shù)を使用してこれらの手順を 1 つずつ呼び出すだけです。プロセス指向の重要な利點(diǎn)
プロセス指向は、問題の解決策を分析し、必要なステップを?qū)g行し、関數(shù)を使用してこれらのステップを 1 つずつ呼び出すだけです。オブジェクト指向は、問題を構(gòu)成するトランザクションをさまざまなオブジェクトに分解することです。オブジェクトを確立する目的は、ステップを完了することではなく、問題を解決するステップ全體における何かの動(dòng)作を記述することです。
例えば次の例です
オブジェクト指向では問題をステップではなく機(jī)能で分割していることがはっきりとわかります。チェスのゲームの描畫でも、プロセス指向の設(shè)計(jì)ではこのような動(dòng)作が複數(shù)のステップに分散されており、通常、デザイナーは実際の狀況を考慮してさまざまな簡略化を行うため、異なる描畫バージョンが表示される可能性があります。オブジェクト指向設(shè)計(jì)では、描畫はチェス盤オブジェクト內(nèi)にのみ表示できるため、描畫の統(tǒng)一性が保証されます
クラスとオブジェクトの関係
オブジェクト: オブジェクトは人々が研究したいもの、それです。具體的なものだけでなく、抽象的なルール、計(jì)畫、イベントを表すこともできます。オブジェクトには狀態(tài)があり、オブジェクトはデータ値を使用してその狀態(tài)を記述します。オブジェクトには、オブジェクトの狀態(tài)を変更するために使用される操作もあります。オブジェクトとその操作は、オブジェクトの動(dòng)作です。オブジェクトはデータと操作の組み合わせを?qū)g現(xiàn)するため、データと操作はオブジェクトの単一性の中にカプセル化されます。 クラス: 同じ特性 (データ要素) と動(dòng)作 (関數(shù)) を持つオブジェクトを抽象化したものがクラスです。したがって、オブジェクトの抽象化がクラスであり、クラスの具體化がオブジェクトです。クラスのインスタンスがオブジェクトであり、クラスが実際にはデータ型であるとも言えます。クラスにはオブジェクトの狀態(tài)を抽象化した屬性があり、データ構(gòu)造を使用してクラスの屬性を記述します。クラスには、オブジェクトの動(dòng)作を抽象化したオペレーションがあり、オペレーション名とそのオペレーションを?qū)g裝するメソッドによって記述されます。 オブジェクトとクラスの関係: クラスとオブジェクトの関係は、型と鋳物の関係に似ており、クラスの強(qiáng)さの結(jié)果がオブジェクトであり、オブジェクトの抽象化がクラスです。は、同じ特性 (屬性) を持つオブジェクトのグループと同じ動(dòng)作を持つオブジェクトを表します。phpクラスのメンバー屬性とメンバーメソッド
クラスによって定義されたメソッド
<?php class phpClass { var $var1; var $var2 = "constant string"; function myfunc ($arg1, $arg2) { [..] } [..] } ?>
<?php class boy{ var $name ="jw"; var $age = "21"; var $sex = "男"; var $height = "182CM"; var $eye = "big"; //函數(shù)(成員方法) function zuofan(){ return "做飯<br>"; } function jiawu(){ return "家務(wù)<br>"; } }; ?>
注: メンバー屬性は、演算子、変數(shù)、メソッド、または関數(shù)呼び出しを含む式にすることはできません。宣言されたメンバー メソッドはオブジェクトに関連している必要があり、無意味な操作であってはなりません。
インスタンス化されたオブジェクト
クラスのインスタンス化形式は次のとおりです: $object name = new class name ([parameter]) // クラスのインスタンス化: というステートメント。クラスはオブジェクトになります
new.php で提供されるソース コードでは、オブジェクトをインスタンス化してアクセスする方法が明確にわかります。
<?php class boy{ //變量(成員屬性) var $name ="jw"; var $age = "21"; var $sex = "男"; var $height = "182CM"; var $eye = "big"; //函數(shù)(成員方法) function zuofan(){ return "做飯<br>"; } function jiawu(){ return "家務(wù)<br>"; } } $boy1 = new boy(); $boy1->name = "張三"; $boy2 = new boy(); $boy2 ->name = "李四"; echo $boy1 -> sex."<br>"; echo $boy2 -> height."<br>"; ?>
-> 記號(hào)はアクセスオブジェクト名の下のクラスを表します。
特別なオブジェクト參照「this」。
それがオブジェクトのメンバーである限り、このオブジェクトの內(nèi)部およびメソッドにアクセスするには、このオブジェクトを使用する必要があります。
<?php class boy{ //變量(成員屬性) var $name ="jw"; var $age = "21"; var $sex = "男"; //函數(shù)(成員方法) public function zuofan(){ echo "{$this->name} 做飯<br>"; $this->jiawu(); } function jiawu(){ echo "家務(wù)<br>"; } } $boy1 = new boy(); $boy2 = new boy; $boy2 ->name = "李四"; $boy1->name = "張三"; $boy1->zuofan(); $boy2->zuofan(); ?>
コンストラクターメソッド
コンストラクター関數(shù)は特別なメソッドです。これは主に、オブジェクトの作成時(shí)にオブジェクトを初期化する、つまりオブジェクトのメンバー変數(shù)に初期値を割り當(dāng)てるために使用され、オブジェクトを作成するステートメント內(nèi)で常に new 演算子と一緒に使用されます。
1. オブジェクトの作成後に最初に自動(dòng)的に呼び出されるメソッドです (特殊)
2. メソッド名はクラス名と同じにすることができます
3. 初期値を割り當(dāng)てるために使用します。オブジェクト內(nèi)のメンバーに .
<?php class boy{ //變量(成員屬性) var $name; var $age; var $sex; function __construct($name,$age,$sex="男"){ $this->name="$name"; $this->age="$age"; $this->sex="$sex"; } //函數(shù)(成員方法) public function zuofan(){ echo "{$this->name} 做飯<br>"; $this->jiawu(); } function jiawu(){ echo "家務(wù)<br>"; } } $boy1 = new boy("名字",28); $boy2 = new boy("名",26,"男"); $boy1->zuofan(); $boy2->zuofan(); ?>
Destructor メソッド
Destructor (デストラクター) コンストラクターとは逆に、オブジェクトがそのライフサイクルを終了するとき (たとえば、オブジェクトが配置されている関數(shù)が呼び出されたとき) )、システムは自動(dòng)的にデストラクターを?qū)g行します。
PHP 5 では、他のオブジェクト指向言語と同様のデストラクターの概念が導(dǎo)入されました。構(gòu)文形式は次のとおりです。
void __destruct ( void )
Inheritance
PHP は、キーワード extends を使用してオブジェクトを継承します。 class の場(chǎng)合、PHP は多重継承をサポートしていません。形式は次のとおりです:
<?php
class Child extends Parent {
// コード部分
}
?>
アクセス制御
PHP屬性またはメソッドの場(chǎng)合、アクセス制御はキーワード public (パブリック)、protected (保護(hù))、または private (プライベート) を先頭に追加することで実現(xiàn)されます。
· パブリック: パブリック クラスのメンバーにはどこからでもアクセスできます。
· 保護(hù): 保護(hù)されたクラスのメンバーは、それ自體、そのサブクラス、親クラスからアクセスできます。
· プライベート: プライベート クラスのメンバーには、それが定義されているクラスのみがアクセスできます。
public.php protected.php private.php を參照して違いを確認(rèn)できます
メソッドの書き換え
メソッドのオーバーライド/オーバーライド - どのような狀況で使用されるか: 親クラスがすべてのサブクラスを認(rèn)識(shí)している場(chǎng)合 すべてが必要ですメソッドを使用しますが、親クラスがこのメソッドの書き方を知らない場(chǎng)合は、メソッドのオーバーロードを使用する必要があります?,F(xiàn)時(shí)點(diǎn)では、サブクラスでこのメソッドをオーバーライドすることができます。
人気のある例 - 親クラス (animal) は、そのサブクラス (貓と犬) が吠えることを知っていますが、その鳴き聲は異なるため、親クラスはこのメソッドを作成できず、サブクラス (貓と犬) には犬のみを許可できます)定義します。コードは次のとおりです:
<?php class Animal{ public $name; protected $price; function cry(){ echo "不知道動(dòng)物怎么叫"; } } class Dog extends Animal{ function cry(){ echo "汪汪..."; } } class Pig extends Animal{ function cry(){ echo "哼哼..." } } ?>
インターフェース
インターフェースは規(guī)定であり、抽象クラスに似た、人が継承できるものです
その中で定義されたメソッドはインスタンス化されませんが、それを?qū)g裝するには他のクラスが必要であり、インターフェースによって定義されたすべてのメソッドは 1 つずつ実裝する必要があります。たとえば、
インターフェイス Shop
{
public function buy($gid);
public function view($gid);
}
ショップ インターフェイス クラスを宣言し、次の 3 つのメソッドを定義します。 、sell、view の場(chǎng)合、このクラスを継承するすべてのサブクラスは、これら 3 つのメソッドのいずれかを?qū)g裝する必要があります。サブクラスがこれらを?qū)g裝していない場(chǎng)合、機(jī)能しません。実際、インターフェイス クラスは、端的に言えば、クラスのテンプレートであり、クラスの規(guī)則です。このカテゴリに屬する??場(chǎng)合は、どのような方法であっても、私の規(guī)則に従わなければなりません。
<?php class BaseShop implements Shop { public function buy($gid) { echo('你購買了ID為 :'.$gid.'的商品'); } public function sell($gid) echo('你賣了ID為 :'.$gid.'的商品'); } public function view($gid) { echo('你查看了ID為 :'.$gid.'的商品'); } } ?>
定數(shù)
クラス內(nèi)で常に変更されない値を定數(shù)として定義できます。定數(shù)を定義および使用するときに $ 記號(hào)を使用する必要はありません。 定數(shù)の値は固定値である必要があり、変數(shù)、クラス屬性、數(shù)學(xué)的演算や関數(shù)呼び出しの結(jié)果にすることはできません。<?php class MyClass { const constant = '常量值'; function showConstant() { echo self::constant . PHP_EOL; } } echo MyClass::constant . PHP_EOL; $classname = "MyClass"; echo $classname::constant . PHP_EOL; // 自 5.3.0 起 $class = new MyClass(); $class->showConstant(); echo $class::constant . PHP_EOL; // 自 PHP 5.3.0 起 ?>phpの::の意味クラス內(nèi)の靜的メソッドと靜的屬性の參照メソッド
例えば
<?php class Test{ public static $test = 1; public static function test(){ } } ?>Test::$testを使用すると、オブジェクトをインスタンス化せずに$test屬性の値を直接取得できます
靜的メソッド呼び出しも同様に、Test::test(); で靜的メソッド test を直接呼び出します
抽象クラス
PHP プログラマーにとって、習(xí)得するのが最も難しい點(diǎn)は PHP 抽象の知識(shí)點(diǎn)ですクラスの申し込み。私は初心者なので、まだオブジェクト指向の知識(shí)を使ってプログラミングする準(zhǔn)備ができていませんが、將來的には、クラスを使用してカプセル化したり、インターフェイスを使用してさまざまなモジュール形式でプログラムを開発したりすることは避けられません。 自然言語では、抽象概念をオブジェクトの大きな説明として理解します。これは、特定の種類のオブジェクトに共通する特性です。 PHP にも同じことが當(dāng)てはまります。クラスを抽象化する場(chǎng)合、このクラスは、そのサブメソッドが実裝する必要があるいくつかの動(dòng)作を示すテンプレートである必要があります。 PHP抽象クラスアプリケーションの定義: 抽象クラスClassName{}PHP抽象クラスアプリケーションのキーポイント: 1. いくつかのメソッドを定義し、サブクラスはこの抽象化のすべてのメソッドを完全に実裝する必要があります 2.抽象クラスからオブジェクトを作成することはできません。その意味は拡張されることです 3. 抽象クラスには通常、抽象メソッドがあり、メソッドには中括弧がありませんPHP 抽象クラスの適用ポイント: 1. 抽象メソッドは次のことを行います特定の関數(shù)を?qū)g裝する必要はなく、サブクラスによって完了します 2. サブクラスが抽象クラスのメソッドを?qū)g裝する場(chǎng)合、サブクラスの可視性は抽象メソッドの定義以上である必要があります 3.抽象クラスのメソッドはパラメータを持つことも、空にすることもできます 4 . 抽象メソッドにパラメータがある場(chǎng)合、サブクラスの実裝にも同じ數(shù)のパラメータが必要ですPHP抽象クラスの適用例:abstract public function_name( ); //中括弧がないことに注意してくださいPHP 抽象クラスのルール:
1. クラスに少なくとも 1 つの抽象メソッドが含まれている限り、抽象クラスとして宣言する必要があります
2. 抽象メソッドには関數(shù)本體を含めることはできません
3.クラスを?qū)g裝する場(chǎng)合、抽象メソッドを?qū)g裝する人は、抽象メソッドと同じか、それ以下のアクセス レベルを持つ必要があります
4. 抽象クラスのサブクラスを継承するすべての抽象メソッドを?qū)g裝しない場(chǎng)合、そのサブクラスも抽象クラスになります。実裝してみましょう 単純な抽象クラス: 長方形の面積を計(jì)算します。この長方形は形狀クラスから拡張できます。
abstract.php コードを表示できます
Final キーワード
クラスを継承したくない場(chǎng)合は、final を使用してこのクラスを変更します。このクラスは継承されません。
final---クラスとメソッドの前に使用されます。
最終クラス --- 継承できません。 最終メソッド --- オーバーライドできません。
最終クラスは継承できません。
クラスを拡張不可能にするだけの場(chǎng)合は、クラスの前に Final を追加して、クラスが継承できないようにすることができます。
PHP の変數(shù)スコープのもう 1 つの重要な機(jī)能は、靜的変數(shù)です。靜的変數(shù)はローカル関數(shù)スコープ內(nèi)にのみ存在し、プログラムの実行がこのスコープを離れるときに一度だけ初期化され、その値は消えず、最後の実行の結(jié)果が使用されます。
PHP_EOL
改行
親クラスのコンストラクターメソッド
parent::__construct() を呼び出します。
PHP は、サブクラスのコンストラクターで親クラスのコンストラクターを自動(dòng)的に呼び出しません。親クラスのコンストラクターを?qū)g行するには、サブクラスのコンストラクターでそれを呼び出す必要があります