ホームページ >バックエンド開発 >PHPチュートリアル >PHPオブジェクト指向の詳しい解説_PHPチュートリアル

PHPオブジェクト指向の詳しい解説_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:15:581149ブラウズ

オブジェクトの主な 3 つの特性
オブジェクトの動作: オブジェクトにどのような操作を適用できるか、ライトをオンにするかライトをオフにするかがビヘイビアーです。
オブジェクトの形状: メソッドが適用されたときのオブジェクトの反応、色、サイズ、外観。
オブジェクトの表現: オブジェクトの表現は、同じ動作と状態の違いを明確に区別します。

オブジェクト指向モデル

オブジェクト指向の概念:
oop (オブジェクト指向プログラミング) は、コードをより簡潔にし、保守しやすく、再利用しやすくすることができます

クラスとは:
クラスは同じ A を持ちます人、本、船、車などの属性とサービスを持つオブジェクトの集合。すべてがクラスに属し、そのクラスに属するオブジェクトの統一された抽象記述を提供します。プログラミング言語では、クラスは別個のプログラムです。属性とサービスの説明を含むクラス名が必要です。
オブジェクトとは:
オブジェクトは、客観的なイベントを記述するシステム内のエンティティであり、システムを構成する基本単位です。 *データとコードはエンティティにバンドルされています* オブジェクトは、一連のプロパティと、この一連のプロパティに対して動作する一連の動作で構成されます。
抽象的な観点から見ると、オブジェクトは問題領域または実装領域内の何かを抽象化したものです。これは、保存された情報と、システム内でその物体が果たす役割を反映します。これは、プロパティのセットと、これらのプロパティを操作する権限を持つカプセル化本体です。客観的な世界は、オブジェクトとオブジェクト間の接続で構成されます。
クラスとオブジェクトの関係:
クラスとオブジェクトの関係は、型と鋳物の関係に似ており、クラスの強度の結果がオブジェクトであり、オブジェクトの抽象化がクラスを表します。同じ特性 (属性) を持つオブジェクトと同じ動作を持つオブジェクトのグループ。

属性とメソッドを持つクラス

PHPで定義されたクラス構文形式:

コードをコピー コードは次のとおりです:

class classname [オプションの属性]{
public $property [=value] ;… // public を使用してパブリック識別子を宣言し、変数に値を割り当てることもできます
function functionname (args){ // クラス メソッドのメンバー関数
code} ...
//クラスメソッド (メンバー関数)
}

オブジェクトの生成 (クラスのインスタンス化): $object name=new classname( );

オブジェクトのプロパティを使用します

クラスでは、特別なポインターにアクセスできますクラス内の操作によって設定される場合は $this 、または変数にアクセスする場合は $this->name を使用して参照します。
オブジェクトの生成
クラスのカプセル化の特性により、 new を使用して宣言します。オブジェクト データの場合、メイン プログラム ブロックからオブジェクトに直接アクセスすることはできません。クラスで定義されているプロパティと動作関数は、オブジェクトを通じて呼び出され、コントロール クラスのデータにアクセスするという目的を間接的に達成します。
オブジェクトとクラスの関係
オブジェクトとクラスの関係:
オブジェクトは実際に存在し、動的リソースを占有します。
クラスはオブジェクトの設計図であり、静的リソースを占有する場合があります。
オブジェクト属性は動的リソースを占有します
クラス(静的)属性は、実際にはクラス名前空間の「グローバル変数」です
パフォーマンスに関する考慮事項:
各オブジェクトは個別のデータ空間を占有します
呼び出しレベルの増加により実行時間が消費される可能性があります
メソッド パラメータ形式と転送メソッド
メソッドのパラメータには、基本的なデータ型、配列、クラス オブジェクトを使用できます。
基本データ型: 値パラメータの受け渡し
配列: 値パラメータの受け渡し
クラスオブジェクト: 参照の受け渡し
コンストラクター
コンストラクターはクラス内での初期化の役割を果たします
コンストラクターの生成方法は他の関数と同じですが、名前は __construct() である必要があります。
構文形式:
function __construct(parameter){
。 。 。 。 。 。 。 。
}
例:
コードをコピーします コードは次のとおりです。 $age) {
echo "私はコンストラクターです。";
$this->name=$name;
$this->age=$age;


出力結果: Initialization


Destructor


オブジェクトがそのスコープを離れると (たとえば、オブジェクトが配置されている関数が呼び出された場合)、システムは自動的にデストラクターを実行します。終了する前に、デストラクターでメモリを解放する必要があります。
Destructor__destruct デストラクターにはパラメータがありません
例:


コードをコピー
コードは次のとおりです:


class person{
function _ _destruct( )
{ echo "bye bye !" } } $a=新しい人();
アクセスタイプ
public public (public 修飾子) はクラス内外からアクセス可能
private (private 修飾子) はクラス内のみアクセス可能
protected (protected member 修飾子) サブクラスはアクセスできないアクセス クラスの外部からアクセス可能

oop の 3 つの重要な機能

カプセル化、継承、ポリモーフィズム
カプセル化: カプセル化とは、オブジェクトのプロパティと動作を独立した単位に結合することです。
クラスのカプセル化には 2 つのステップが必要です。最初のステップは、set と get を使用して値を読み取り、割り当てることです。
利点は、クラスの実装の詳細を非表示にし、ロジックを簡単に追加できることです。属性に対する不当な操作を簡単に修正して、コードの保守性を向上させることができます。

__get と __set
一般的に言えば、クラスをプライベートにする方が現実的です。
値の取得と適用には、2 つの事前定義関数が使用されます。
__get 取得される値は通常フィールドの値です
__set 設定される値は通常フィールドの値です
__call オブジェクトに存在しないメソッドが呼び出された場合、 call() メソッドはエラーとなります。この状況に対処するために使用されます。

静的プロパティとメソッド

静的メソッドを宣言するためのキーワード
静的静的変数。クラス内で静的変数を生成すると、すべてのクラスで共有できます。つまり、静的メンバーは「初期化された静的」セクションに配置されます。 」は、クラスの初回ロード時に配置され、ヒープメモリ内のすべてのオブジェクトで共有できます
使用メソッド:self::$staticプロパティ、self::staticメソッド
static関数p(){
echo self::$country;
echo self::PI;//定数にアクセスする
//echo $this->name; は静的メソッドでのみ操作できます
//self::p() }
外部呼び出し: Class::$static プロパティ、Class::static メソッド

const キーワード: 定数は変更できない唯一の規則です。
const CONSTANT = '定数値';定数
echo self::CONSTANT;//内部クラス アクセス
echo ClassName::CONSTANT;//外部クラス アクセス


継承
クラス B のオブジェクトは、クラス A のすべての属性と動作を持ちます。 B と A のクラス継承。
クラスが複数のクラスからプロパティとサービスを継承する場合、これは多重継承と呼ばれます。通常、継承するクラスをサブクラスと呼び、継承されたクラスは親クラスとなります。PHP では、単一の継承のみが存在します。クラスの継承は複数のクラスによって継承されますが、サブクラスは親クラスを 1 つしか持つことができませんが、関連付けられた継承が許可され、継承によってクラスの定義を減らすことができます。
extendeは継承関係を宣言します
構文形式: class B extends A この例は、BがAを継承することを示します
クラスの外部アクセスはサブクラスに対して有効です
サブクラスと親クラスの属性とメソッド
サブクラスはすべての内容を継承します親クラスのプライベート部分に直接アクセスすることはできませんが、サブクラスに新しく追加された属性とメソッドは、親クラスと同じ名前でサブクラスに定義された属性はオーバーライドされます。親クラスの属性のオーバーライドであり、同じ名前のメソッドは親クラスのメソッドのオーバーライドでもあります


オーバーライドされたメソッド

サブクラスでは、parent を使用して親クラスのオーバーライドされたプロパティとメソッドにアクセスします
parent::__construce();
parent::$name ;

親クラスの元の属性を上書きする
clone clone $p; object $p 出力 echo $c->name;


オブジェクト比較

===2 つの比較演算子。
== は 2 つのオブジェクトの内容を比較します。 === は比較対象のハンドル、つまり参照アドレスです。
instanceof 演算子は、オブジェクトが特定のクラスに属しているかどうかを検出するために使用されます。 属していない場合は、
__clone() の内容を変更します。クローン作成後、元のオブジェクトを __clone() のプロパティとメソッドで書き直す必要があります。
function __clone(){
$this->name="I am a clone"
}

final はクラスを意味します。は最終バージョンであり、サブクラスから呼び出すことができないことを意味します


ポリモーフィズム ポリモーフィズムとは、親クラスで定義された属性や動作がサブクラスに継承された後、異なるデータ型を持つことができたり、異なる動作を示すことができることを意味します。これにより、同じプロパティまたは動作が親クラスとそのさまざまなサブクラスで異なるセマンティクスを持つことが可能になります。
つまり、サブクラスと親クラスで同じメソッドを実行した結果が異なります。

コードをコピー

コードは次のとおりです:

class A { function info(){ echo "A INFO" } }
class B extends A {
function info(){
echo "B INFO";
}
}
class C extends A {
function info(){
echo "C INFO";
function printinfo(A $obj){
if( $obj インスタンス of A)
$obj->info();
}
$a=new A(); c=new C();
printinfo($a); //A の INFO を出力
printinfo($c); //C の INFO を出力


;および抽象クラス


抽象メソッドはサブクラスのテンプレートとして使用されます。



コードをコピーします

コードは次のとおりです:

abstract class Person{
public $name;
abstract function getInfo();

抽象クラスでは、抽象メソッドが必要です。ただし、動的関数は抽象クラスで定義できます。
インターフェース
クラスがインターフェースを継承する場合、インターフェースのすべてのメソッドをカバーする必要があります。インターフェースのメソッドは共有として定義する必要があります。そうしないと、インターフェースは複数のインターフェースから継承できません。 :


コードをコピーします コードは次のとおりです:
interface PCI{
const
//public $name error
function start();
}


インターフェイス内でメソッドは静的として宣言できます


コードをコピーします
コードは次のとおりです: interface A{ function a();}
interface B{ function b() ;}
インターフェイス C は A{ function c(); を拡張します }
クラス D は B,C{
function a(){}
function b(){}
function c(){}
}



Class

クラス宣言:

コードをコピー
コードは次のとおりです: Permission修飾子 class クラス名 { //Permission モンクシンボル: public、protected、private または省略 3.
/ /Class body; //class はクラス作成のキーワードです
​​ } 富lves#\//ps: class キーワードの前に追加できるパーミッション修飾子に加えて、{} の間にクラスのメンバーを追加することもできます。 {} static や abstract などのキーワード。クラス、つまり 1 対の中括弧内のすべてのコンテンツを 1 つのコード内に含める必要があります。クラス内のコンテンツをブロックのペアに分割することはできません。 ;?php
class ConnDB{
//....
?>
//...
?>



クラス内で直接宣言された変数メンバー属性/変数と呼ばれます。その型は、PHP ではスカラー型と複合型になります。また、メンバー属性を宣言する場合は、キーワード: 特定の意味を持つキーワードを使用して変更する必要があります。 : public、protected 、private; 特別な意味は必要ありません: var. メンバーのプロパティを宣言する場合、初期値を割り当てる必要はありません。


例: const PI = 3.1415926 ;
定数の出力にはインスタンス化は必要ありません。クラス名 + 定数名で直接呼び出すことができます。形式は次のとおりです: クラス名::定数名
ps。特別なアクセス メソッド:------"$ this" と "::"
1) $ "this" はすべてのメンバー メソッドに存在します。メソッドを使用するための特別なオブジェクトです。メンバー メソッドはそのオブジェクトに属し、$this アプリケーションはそのオブジェクトを表します。その機能は次のとおりです。具体的には、オブジェクトの内部メンバー間のアクセスを完了します。
2 ) 「::」は、オブジェクトを作成せずにクラス内の定数、変数、およびメソッドを呼び出すために使用できます。 構文形式は次のとおりです。
キーワード::変数名/定数名/メソッド名

キーワード:parent、親クラスのメンバーのメンバー変数、メンバーメソッド、定数を呼び出すことができます
self、現在のクラスの静的メンバーと定数を呼び出すことができます。
クラス名、クラスやメソッド内で定数や変数を呼び出すことができます;

メンバーメソッド:


クラス内で宣言された関数は複数の関数を宣言できます。複数のメンバー メソッドの宣言は関数の宣言と同じですが、唯一の特別な点は、そのアクセス権を制御するためにメンバー メソッドを変更できることです。

オブジェクトを作成します。 :


$Variable name = new class name ([parameter]); //クラスのインスタンス化
クラスのメンバーにアクセスする:
各クラスの宣言には特別なメンバー メソッドがあり、通常はいくつかのメソッドを完了するために使用されます。クラスにコンストラクターがない場合、システムはデフォルトでパラメーターなしのコンストラクターを自動的に生成します


コードをコピーする
コードは次のとおりです:


function _construct (パラメーター リスト) {
//メソッド本体 };

デストラクターメソッドは、オブジェクトが破棄される前に呼び出される最後のメソッドです。ファイルを閉じたり、メモリを解放したりします。
形式:



コードをコピー
コードは次のとおりです:

function _destruct(){
//メソッド本体
};

オブジェクト指向の機能: カプセル化、抽象化、ポリモーフィズム
Encapsulation:
クラス内のメンバー属性とメソッドを独立した同じユニットに結合します。その目的は、クラスの外部の部分がクラスの内部データ (メンバー プロパティとメンバー メソッド) に自由にアクセスできないようにすることで、オブジェクトへの外部エラーの影響を回避することです。
クラスのカプセル化は、キーワード public、private、protected、static、final によって実現されます。各キーワードの機能については、関連する PHP ドキュメントを確認してください。既存のクラスの属性とメンバーメソッドを継承することで、継承したクラスが親クラスとなり、コードの再利用性と保守性が向上します。
形式:

コードをコピー
コードは次のとおりです: class サブクラス名 extends 親クラス名 { //サブクラスメソッド本体
}


parent:: キーワードを使用して、メンバーメソッドを呼び出すこともできます。子クラスのメソッドに親クラスのメソッドを追加する形式は以下の通りです:
親クラスのParent::Memberメソッド(パラメータ);

いわゆる上書きです。親クラスのメソッド。つまり、子クラスのメソッドを使用して親クラスのメソッドを置き換えます。継承メソッドはメソッド オーバーライドとも呼ばれます。オーバーライドの鍵は、親クラスと同じメソッドをサブクラスに作成することです。


ポリモーフィズム: More モーフィズムとは、複数の種類のオブジェクトを処理するプログラムの機能を指します。つまり、継承によるポリモーフィズムとインターフェイスによるポリモーフィズムです。
ポリモーフィズムは継承を通じて実現されます。つまり、継承された Member メソッドをオーバーライドしてポリモーフィック効果を実現します。コードは次のとおりです。 function printMessage();
}
class SubClassA extends ParentClass{
function printMessage(){ echo "私はクラス A からのメッセージです"; }
}
class SubClassB extends ParentClass{
function printMessage(){
echo "iクラス B からのメッセージです"; } } function printMSG( $object){ if( $object instanceof ParentClass){
$object->printMessage();
}else{
echo "エラー!";

}
$objectA=new SubClassA();
$objectB=new SubClassB();
?>

インターフェイスを定義する次に、クラスはインターフェイスを継承します。



コードは次のとおりです。 InterfaceInfo{
function printMessage(){
echo "メッセージ フォーム クラス A";
}
}
class ClassB は、interfaceInfo{
function printMessage(){
echo "メッセージ フォーム クラス B"
}
}
function printMSG ($object){
if($objectinstanceofinterfaceInfo){
$object -> printMessage();
echo "エラー !"
}
$objectA =new ClassA(); ($objectA);
$objectB();
printMSG($objectB) ;

抽象クラスとインターフェイスはインスタンス化できません。オブジェクト指向ポリモーフィズムと併用することができます。 抽象クラス: 抽象クラス インスタンス化できず、他のクラスの親クラスとしてのみ使用できるクラスです。抽象クラスは、abstract キーワードを使用して宣言されます。以下:
コードをコピー

コードは以下の通りです:


abstract class abstract クラス名 {
抽象関数メンバメソッド(パラメータ) //
}


抽象クラスは、メンバー変数やメンバー メソッドを含め、通常のクラスと似ています。この 2 つの違いは、抽象クラスにはメソッド本体が含まれず、その関数の実装のみが完了できることです。サブクラスでは抽象メソッドも使用されます。

インターフェース:
継承機能により、オブジェクトとクラスの作成が簡素化され、コードの再利用性が向上します。ただし、PHP は単一継承のみをサポートします。複数の継承の場合は、インターフェイスを使用する必要があります。
インターフェイスの宣言: インターフェイスで宣言されたメソッドは、インターフェイス内で宣言できるのは const キーワードだけです。 Access Permissions.ainterface は次のようにインターフェイス形式を宣言します。
コードは次のとおりです。 //メンバーは定数のみです。 //Abstract method; }

インターフェイスはインスタンス化操作を実装できないため、実装形式は次のとおりです。




コードは次のとおりです:
クラスのサブクラス名はインターフェース名 1 [,インターフェース名 2,インターフェース名 3,...]{ //サブクラスのメソッド本体を実装します。
よく使われるキーワード:
1)final:final、finalという意味で、finalキーワードで変更されたクラスやメソッドは継承したり、サブクラスを持ったりすることができません。 ) static: static キーワードによって変更されたメンバー属性およびメンバーメソッドは、静的属性および静的メソッドと呼ばれます。 静的メンバー属性およびメソッドは、インスタンス化されずに直接使用できます。
静的属性: のインスタンスではなく、クラス自体に属します。クラスに格納されているグローバル変数に相当し、クラスを通じて任意の場所にアクセスできます。
クラス名::$static 属性名
の静的プロパティにアクセスする場合。クラス内のメンバーメソッドを作成し、静的プロパティの名前の前に演算子: "self::" を追加します。
静的メソッド: オブジェクトの制限を受けないため、クラスのインスタンス化を渡す必要はありません。クラス内の静的メソッドを直接参照する 参照形式は以下の通りです:
クラス名::静的メソッド名(パラメータ)
クラス内のメンバメソッドで静的メソッドを呼び出したい場合は名前に記述します。静的メソッドの前に演算子「self::」を追加するだけです。静的メソッドでは静的変数のみを呼び出すことができますが、通常のメソッドでは静的変数を呼び出すことはできません。インスタンス化は必要ありません。別の機能は、オブジェクトが破棄された後も、変更された静的データが次の呼び出しのために保持されることです。
オブジェクトの複製は、キーワードを使用して実行できます。元のオブジェクトとは関係がありません。つまり、クローンされたオブジェクトは、元のオブジェクトのコンテンツを保存するためのストレージスペースを再申請します。
$clone object = clone $original クローンオブジェクト名
成功後。クローン作成の場合、その n メンバーのメソッド、属性、および値は完全に等しいです。 コピーを再初期化するには、_clone() を使用する必要があります。
魔法のメソッド _clone() を使用すると、クローンされたコピーを再初期化できます。オブジェクトにはパラメータは必要なく、オブジェクトの $this (コピー オブジェクト) と $that (元のオブジェクト) の参照が自動的に含まれます。
オブジェクトの比較:
「==」は 2 つのオブジェクトの内容を比較することを意味します。 === は、2 つのオブジェクトの参照アドレスが等しいかどうかを比較することを意味します。
オブジェクト タイプの検出: instanceof 演算子は、現在のオブジェクトがどのオブジェクトに属しているかを検出できます。


オブジェクト指向 --- 一般的なマジック メソッド:
共通上記で学んだマジックメソッドは、_construct()、_destruct()、_clone. 以下に、いくつかの一般的なマジックメソッドを紹介します
_get(),_set(); 上記の 2 つのメソッドは、値をコピーまたは取得するために使用されます。
_set() は、プログラムの実行中にプライベート メンバーの属性の値を設定します。_set() メソッドには、変数名と変数値という省略できない 2 つのパラメーターが含まれます。 . このメソッドは積極的に呼び出す必要はなく、プログラムの実行中にオブジェクトの外に private キーワードを追加することができます。 パラメータは 1 つあります。 : プライベートメンバー属性の名前。このメソッドは外部から使用できるようにする値を返します。

_isset(),_unset():
isset() という関数です。オブジェクト指向では、パブリック メンバー属性は isset() 関数を通じて検出できますが、この関数はプライベート メンバー属性に対しては機能しないため、_isset() 関数は Created for を検出するために使用されます。
bool _isset(string name);
_unset() は、オブジェクトの指定された変数とプライベートメンバー属性を削除するためにも使用されます:
void _unset(string name) ;//
_call ():
_call() メソッドの機能は、プログラムが存在しない、または非表示のメンバー メソッドを呼び出そうとしたときに、PHP が最初に _call() メソッドを呼び出してメソッド名とそのメソッドを保存することです。パラメータ(メソッド名とメソッドパラメータ)のうち、メソッドパラメータは配列の形で存在します:
その機能は、オブジェクトを出力するためにechoまたはprintを使用するときにオブジェクトを文字列に変換することです。 _toString() メソッドがない場合、オブジェクトを直接出力すると致命的エラーが発生します。
オブジェクトを出力する場合、出力するオブジェクトの直後に echo または print ステートメントを追加しないように注意してください。余分な文字が途中にある場合、_toSting() は実行されません。
_autoload() メソッド:
独立した完全なクラスを PHP ページに保存し、ファイル名とクラス名の一貫性を保つことは、すべての開発者が行う良い習慣です。この方法では、次回使用するときに簡単に見つけることができます。ただし、ページに多くのクラスを導入したい場合は、 include_once() 関数または require_once() 関数を使用する必要があるという状況があります。 php5 で導入された _autoload() メソッドは、クラスがインスタンス化されていない場合、そのクラスと同じ名前のファイルを自動的に検索します。指定されたパスが見つかった場合は、実行を続行します。そうでない場合は、エラーが報告されます。


コードは次のとおりです。

function _autoload($class_name){
$class_path = $class_name.'.class.php';
if(file_exists($class_path)){
include_once($class_path);
}else {
echo 'クラスが存在しないか、クラスパスが間違っています';
}
}
$class = new Class(); //クラスの内容を出力します。 _toString() メソッドでは、_toString() で定義された内容が出力されます。



http://www.bkjia.com/PHPjc/326008.html
www.bkjia.com

tru​​ehttp://www.bkjia.com/PHPjc/326008.html技術記事オブジェクトの主な 3 つの特性はオブジェクトの動作です。オブジェクトにどのような操作を適用できるか、ライトのオン/オフが動作です。 オブジェクトの形状: これらのメソッドが適用されたときのオブジェクトの反応、色...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。