ホームページ  >  記事  >  バックエンド開発  >  phpオブジェクト指向のメモ

phpオブジェクト指向のメモ

WBOY
WBOYオリジナル
2016-06-23 13:04:45956ブラウズ

========================================= == =========
PHP のオブジェクト指向:

オブジェクトとは、客観的に存在する実体です。
クラスはオブジェクトの抽象的な記述です。

概念: オブジェクト (エンティティ)、クラス、クラスとオブジェクトの関係。

OOP オブジェクト指向プログラミングの特徴: カプセル化、継承、ポリモーフィズム

クラスとオブジェクトの関係:
クラスのインスタンス化の結果はオブジェクトです (new キーワードを使用)
オブジェクトの抽象的な記述はクラスです

= ============================================= ==
1. クラスの定義と使用方法

1.1 構文形式:
[修飾子] class クラス名 [親クラスを拡張] [実装インターフェース 1 [, インターフェース 2...]] {
[メンバー属性]変数を定義する
[メンバーメソッド] 関数を定義する
}

1.2 メンバー属性の形式:
修飾子 $変数名 [=デフォルト値]; 例: public $name="zhangsan"
注: メンバー属性には演算子を含めることはできません。式、変数、メソッド、または関数に。 例:
public $var3 = 1+2;
public $var4 = self::myStaticMethod();
正しい定義:
public $var6 = 100; 4 スカラー: 整数、浮動小数点、ブール値、文字列)
public $var6 = myConstant; //Constant
public $var7 = self::classConstant; // public $var8 = array(true, false); Array

一般的に使用される属性修飾子: public、protected、private、static、var

1.3 メンバーメソッドの形式:
[修飾子] 関数メソッド名 (パラメーター..) {
[メソッド本体]
[return 戻り値]
}

一般的なメソッド修飾子: public、protected、private、static、abstract、final

1.4 オブジェクト: クラスのインスタンス化によりオブジェクトが生成されます。
例: $p = new Person();

1.5 $this キーワード: それ自体を表し、現在使用されているオブジェクトを示します。*呼び出されるオブジェクトはどのオブジェクトを表します

1. クラス内で独自のメンバー属性またはメソッドを呼び出すときでは、$this->Call を使用します。

2. 注: 静的メソッドでは $this キーワードを使用できません

=================================== = =================

2. 構築方法と破棄方法

2.1. 構築方法:
1. new キーワードを通じてオブジェクトを作成すると、最初に An が自動的に実行されます。メソッドはコンストラクターと呼ばれます。

2. メソッド名 __construct(); は主にオブジェクトを初期化するために使用されます。
(PHP 4.0 では、クラス名と同じ名前のメソッドをコンストラクターとして使用できます)

2.2. 破棄メソッド: このオブジェクトが破棄されるときに自動的に呼び出される最後のメソッドをデストラクター メソッドと呼びます。
1.__destruct(); 目的はリソースを解放することです (接続、ファイルを閉じる、リソースを解放するなど)

2. オブジェクトが破棄されるときの最後の自動呼び出し

=========== ===== ===================================

3. カプセル化 (アクセス制御)

3.1 カプセル化: プライベートまたは保護されたプライベートを「プロパティ」にすることを意味し、パブリック セッター配置メソッドとゲッター値メソッドを提供します


public (public) protected (protected) private (private)
============= == ============================================
このカテゴリー内Y Y Y

ファミリ内の Y Y N

クラス外の Y N N
public は、クラス外からこのクラスのメソッドまたはプロパティを呼び出す必要がある場合に使用されます
protected は、クラス外で呼び出す必要はありませんが、クラス内で使用する必要があります家族
プライベートはセキュリティ情報に使用され、現時点でのみ使用されますクラス

================================ ================== ====
4. オーバーロード

4.1 属性のオーバーロードの 4 つのマジック メソッド: __set() __get() __isset() __unset()

__get(): オブジェクト内の非公開値を直接出力する場合 属性を選択する際に自動的に呼び出されるメソッドで、
第一パラメータとして属性名を渡します。

__get($name){...} //外部: $m->priAge;

__set(): オブジェクトに非公開プロパティを直接設定するときに自動的に呼び出されるメソッド

とセットプロパティ 名前は最初のパラメータとして渡され、値は 2 番目のパラメータとして渡されます。
__set($name,$value){...} //外部: $m->priAge = 100;

__isset(): オブジェクト属性を確認します isset($this->name) または empty($ this->name)、$this->name が非公開プロパティである場合、このメソッドは自動的に呼び出されます。
public function __isset($param){
return isset($this->$param);
}

__unset() オブジェクト属性を破棄する場合 unset($this->name), $this->nameこのメソッドは、非パブリック プロパティの場合に自動的に呼び出されます。
public function __unset($param){
unset($this->$param);
}

4.2 メソッドのオーバーロード:
mixed __call ( string $name , array $arguments )
mixed __callStatic ( string $name , array $arguments ) php5.3.0 は

1 をサポートします。 アクセスできないメソッド (未定義または非表示など) が呼び出されるとき、__call() が呼び出されます。
2. アクセスできないメソッド (未定義、非表示など) が静的メソッド内で呼び出される場合、__callStatic() が呼び出されます。

最初のパラメータはメソッド名を表し、2 番目のパラメータは呼び出し時のパラメータリスト (配列型) を表します

class A {

//存在しないメソッドを呼び出します
public function __call($methodName,$args) {
echo $ methodName;
print_r($args);
}

//存在しない静的メソッドを呼び出す

static public function __callStatic($methodName,$args) {
echo '
'.$methodName ;
print_r ($args);
}
}
$a = new A;
$a->say('a','b');
A::test('c','d') ;

============================================== === =

5. 継承

5.1 継承: extends

※継承の目的: 重複コードを減らすため。

クラスBがクラスAを継承する場合、クラスAの非プライベートなプロパティとメソッドをすべて継承します。 このうち、Aを親クラス(基底クラス)、Bをサブクラス(派生クラス)と呼びます。
class B extends A{
....
}

1.*parent: サブクラスに親クラスをオーバーライドするメソッドがある場合、オーバーライドされた親クラスのメソッドを呼び出して、それをサブクラスのメソッドとマージします。一緒に

形式: 親::親クラスメソッド | 親クラス名::親クラスメソッド


class A{
public function __construct(){
//....
}
}
class B extends A{
public function __construct(){
parent::__construct();//親クラスのコンストラクターメソッドの呼び出しに注意
//....
}
}

2. 継承の特徴

1. PHP がサポート単一継承 、クラスは 1 つの親クラスのみを継承できます
2. PHP はマルチレベル継承をサポートし、子孫クラスを持つことができます
3. サブクラスは親クラスのすべての属性とメソッドを継承しますが、プライベート属性とメソッドを呼び出すことはできません

3. 属性の継承
1. プライベート属性は上書きされませんが、他の属性は上書きされます。
2. 属性の変更は、より厳密にではなく、より緩やかにのみ行うことができます。 緩み: public > protected > private
3. サブクラスが親クラスと同じ名前の属性を持ち、親クラスが public $name を持つ場合、サブクラスは public 変更のみを使用できます
3.親クラスの属性と同じ名前の属性。親クラスは $name を保護しています。サブクラスは保護された変更とパブリックな変更を使用できます
4. メソッドの継承

1. すべてのメソッドは継承できますが、プライベート メソッドは使用できません

2. サブクラスが親クラスと同じ属性を持つ場合 同名のメソッドはプライベートメソッドを除き上書きされます。
3. サブクラスに親クラスと同じ名前のメソッドがある場合、メソッドの変更はより厳密ではなく、より緩やかになるだけです。

=============================================== == ===

6.final、static、const

*メモリロジック:定数領域(定数、静的属性)、コード領域(クラス、関数)、スタックメモリ(通常の小さな変数)、ヒープメモリ(大きな変数)

6.1 Final キーワード: 主にクラスとメンバー メソッドの変更に使用されます

目的: 第一に安全のため、第二に必要ありません


1. クラスを変更するには、final キーワードを使用します。これは、サブクラスを防ぐためにこのクラスが継承できないことを示しますOverride

2. Final キーワードで変更されたメソッドは、サブクラスでオーバーライド (オーバーライド) できません。

3. Final キーワードを使用してプロパティを変更することはできません

Final class B {

Final public function A {

..
}
}
------------------ -------------------------------------------------- -
6.2 static キーワード: 静的を意味し、クラスの属性とメソッドを変更するために使用されます

static キーワードで変更された属性/メソッドは、静的属性/静的メソッドと呼ばれます。
注: 静的メソッドは、クラスのインスタンス化後にはアクセスできません。 object //$オブジェクト名- >静的メソッド名
1. new(インスタンス化)せずにメソッドや属性を直接使用できます
*外部呼び出し: クラス名::メソッド名 クラス名::プロパティ名
*呼び出しclass: self::静的プロパティ名 | self::静的メソッド名

※2. 静的プロパティは共有されます。つまり、複数のオブジェクトの呼び出しも同じアドレスを指します

3. 静的メソッドでは非静的コンテンツを使用できません。 $this は使用しないでください

4. クラス メソッドに $this の呼び出しがない場合、そのメソッドはデフォルトで静的メソッドになります。

5.static はクラスを変更できません

-------------------------------------- - -----------------------

6.21 デザインパターン。目的: リソースの節約

1. シングルトン設計パターン 2. ファクトリ設計パターン 3. 抽象ファクトリ設計パターン

class Single

{
// オブジェクトを格納する静的プロパティを定義
static private $obj = null;民間工法。オブジェクトをクラスの外でインスタンス化することはできません
private function __construct() {}

// オブジェクトをインスタンス化します

static public function test() {

// オブジェクトがない場合は、新しいオブジェクトの作成を許可します
if( !self ::$obj) {

self::$obj = new Single();//オブジェクトを作成します

}

//オブジェクトを使用して、前のオブジェクトを直接返します
return self::$obj;
}

//単一ケースの複製は許可されません

public function __clone() {
trigger_error('error', E_USER_ERROR);
}

}


$s1 = Single::test($s1);
$s2 = Single::test($s2); //同じオブジェクトを呼び出す
$s3 = clone $s2; //

----------------------------------------------- - --------------
6.3. const キーワード: クラス内のメンバー属性を変更し、定数として定義します (変更不可)。

1. 通常、定数名は大文字である必要があります。文字 はい、「$」文字やその他の修飾子はありません (public)

2. 定義形式: const member constant name="value";

3. 使用法:
*外部呼び出し: class name:: member constant name;
*クラス内で呼び出します: self:: member constant name;

-------------------------------- -- -----------------------------
6.4. 現在のオブジェクトがどのクラスに属しているかを検出します (ファミリークラスも)

1 .instanceof が使用されています PHP 変数が特定のクラスのインスタンスに属しているかどうかを判断します:

class A {}
class B extends A {}
$b = new B;
if($b instanceof A) {echo 'y ';}

2.is_a — オブジェクトがこのクラスに属している場合、またはこのクラスがこのオブジェクトの親クラスである場合に TRUE を返します

==================== ======== ========================
7. 型制約

1. 型制約に使用できる型配列、オブジェクト、コールバック関数です。
クラス名を指定すると、このクラスとサブクラスのオブジェクトを渡すことができます。
使用できる制約の型:(複合型)配列配列、クラス名、抽象クラス名、インターフェース名

class MyClass
{
//最初のパラメータはクラスOtherClass
のオブジェクトである必要があります public function test(OtherClass $ otherclass) {
**他のクラスを渡したり、他のクラスのメソッドや属性を呼び出すことができます
echo $otherclass->var;

//ここでも同じです
if( $otherclass instanceof Hanzi){
$otherclass-> ; qinqin();
}
}

//最初のパラメータは配列でなければなりません
public function test_array(array $input_array) {
print_r($input_array);
}
}

======= = ==========================================
8. その他の魔法の方法:

1. オブジェクトのコピー クローン オブジェクトのクローンを作成します。オブジェクトは参照型であり、通常の「=」記号は参照の代入であるため、
コピーを作成するにはすべてをクローンする必要があります。
マジックメソッド: __clone() はクローン実行時に自動的に呼び出されるメソッドです。

class A {
public function __clone() {
//自動実行
}
}

$a = new A;
$b = clone $a; //クローンは 2 つのオブジェクトです

--- -- ------------------------------------------------ -- ----------
2. __toString() メソッド: マジック メソッド。echo $a、print $a、
など、オブジェクトを直接出力したい場合、メソッドが自動的に呼び出されます。
注: __toString() メソッドは文字列型の値を返す必要があります。

class A {
public function __toString() {
return 'これはオブジェクトです、ehco,print...' は許可されません;
}
}
$a = new A;
echo $a; //エラーご報告

----------------------------------------------- --- ----------------
3. *「クラス関数」を自動的にロードする __autoload (クラス名):
new がオブジェクトをインスタンス化するとき、クラスが存在しない場合は、この関数は自動的に呼び出され、クラス名をパラメータに保存します
これを使用してクラスの自動ロードを実装できます。

function __autoload($className) {
include './autoload/'.$className.'.class.php';
}

$a = new A;
$a->say(); // Say

//autoload/A.class.php
クラス A{
public functionsay() {
echo 'say';
}
}

------------- - ------------------------------------------------- - -
4. オブジェクトを関数として使用する場合、__invoke が自動的に呼び出されます

class A {
public function __invoke() {
echo 'aa';
}
}

$a = new A;
$a() ; //あー

========================================== ==== =======

9. オブジェクトのシリアル化 (Web サービス XML) (オブジェクトの永続的なストレージと送信で使用)

Serialize() -- シリアル化
unserialize() -- 逆シリアル化

1. PHP の値は、serialize() 関数を使用してバイト ストリームを含む文字列を返すことで表すことができます。

2. unserialize() 関数は、文字列を PHP の元の値に戻すことができます。
3. オブジェクトをシリアル化すると、オブジェクトのすべての変数が保存されますが、オブジェクトのメソッドは保存されず、クラスの名前のみが保存されます。

1.__sleep(): シリアル化が行われるときに自動的に呼び出されるメソッドです。目的は、リソースタイプの属性のクローズ操作を実現することです。

@@sleep メソッドは配列を返す必要があり、配列の値はシリアル化中に保持される属性名です
2.__wakeup(): は、リソース属性を実現することを目的として、逆シリアル化を実行するときに自動的に呼び出されるメソッドですオープン (スリープメソッドでリソースをクローズ)

//例:

class A {
public $name1 = 'xiaohei';
public $name2 = 'xiaobai';

public function Demon() {

return 'aa';
}

//シリアル化によって自動的に呼び出されるメソッド

public function __sleep() {
return array('name2') //name2 を格納したいだけの場合は、name2 を返します
}

//逆シリアル化によって自動的に呼び出されるメソッドメソッド

public function __wakeup() {
echo '###';
}
}

$a = new A;

//シリアル化
$data = Serialize($a);

//ファイルに保存
file_put_contents('./1.txt', $data);

//データを取得
$str = file_get_contents(' . /1.txt');

echo $str; //O:1:"A":1:{s:4:"name";s:7:"xiaohei";}

//シーケンスを逆に変更
$tmp = unserialize($str);

print_r($tmp); //A Object ( [name] => xiaohei )

---------------- - ------------------------------------------------- - ------------------
JSON 形式で文字列をエンコード/デコードする

json_encode: JSON エンコード変数
json_decode: JSON 形式で文字列をエンコードする

$arr = array(' id'=>1, 'name'=>'jack');

$str1 = json_encode($arr); //{"id":1, "name":"jack" }

$a = json_decode($str1, true); // true を追加すると配列が返され、それ以外の場合は object が返されます

echo $a; // Array ( [id] => 1 [name] => jack )

================================================ =====

10. 抽象クラス:

目的: 抽象クラスはサブクラス (実装クラス) に制約効果を持ちます。

特徴:

//1. 抽象クラスを定義します
抽象クラス A {
//2.抽象メソッドを定義します
abstract public function test1();
abstract public function test2();

//3. 通常のメソッドとプロパティを持つことができ、子実装は必要ありません

public function Demon() { }
public $name = 'aa';

//4. 抽象プロパティを定義できません 致命的なエラー

abstract public $age = 18;
}

class B extends A {

//5.@@抽象クラスを継承しました 「通常のクラス」抽象クラスの「すべての抽象メソッド」を実装する必要があります
public function test1() {}
public function test2() {}

//6. 抽象メソッドを含むクラスは抽象クラスである必要があります。致命的なエラー

抽象関数test3() {}
}

抽象クラス C extends A {

//7. 抽象メソッドをオーバーライドできません。致命的なエラー
抽象パブリック関数 test1() {}

//8. 同時に抽象クラスを継承できます。 、抽象メソッドを追加します

abstract public function test3();
}

//8. インスタンス化できません、致命的なエラー

$c = new C;

============= = ===================================
11. インターフェース:

目的: 抽象クラスと同じは、より具体的な抽象クラスです
抽象クラス内のすべてのメソッドが抽象である場合は、別の方法を使用して定義できます: インターフェイス
インターフェイスは、インターフェイスというキーワードを使用して定義されます。インターフェイスには定数と抽象メソッドのみが存在します。 。

//1. インターフェースを定義します

インターフェース A {
//2. インターフェースは通常の属性を持つことはできません、致命的なエラーです
public $name = 'aa';

//3. インターフェースは通常のメソッドを持つことはできません、致命的です。 error

public function test() {}

//3. ただし、定数を定義できます

const HOST = 'aa';

//4. インターフェイス メソッドを定義します。抽象化は必要ありません

public function test1();

}

インターフェース B {

//5. インターフェース間に継承関係があり、定義が繰り返されました 致命的なエラー
const HOST = 'bb';

public function test2();

}

class C {}

//6. 同時に使用可能 "単一" クラスの継承と "複数" インターフェイスの実装 (最初に継承してから実装)

クラス D は C を拡張し、A,B を実装 {
//7.@@「通常のクラス」 「抽象クラスを継承するものは、抽象クラスを実装する必要がある」すべての抽象メソッド
public function test1() {}
public function test2() {}
}

抽象クラスとインターフェイスの概要:

1. 目的: を定式化するサブクラスを制限するための仕様
2. 選択肢: if 仕様 クラス内に「通常のメソッド」が必要な場合は、抽象クラスを選択してください
3. 相違点:
1. 定義キーワードが異なります。抽象クラス:abstract インターフェース:interface
2. 継承・実装キーワードが異なります。抽象クラス: 拡張 インターフェイス: 実装
3. 抽象クラスは通常のメソッドを持つことができますが、インターフェイスは通常のメソッドを持つことはできません
4. 抽象クラスは個別にのみ継承でき、インターフェイスは複数の方法で実装できます
5. インターフェイスはメンバー属性を持つことはできません。定数と抽象メソッド

============================================ ====== ===

12. ポリモーフィズム

定義: 「同じメソッド」に対して、「異なるオブジェクト」を渡すと異なる効果が得られます

class Meizi {

public function meets($obj) {
//制限事項 オブジェクトには qinqin() メソッドが必要です
if( $obj instanceof Hanzi){
//同じメソッド
$obj->qinqin();
}else{
echo 'この関数にキスすることはできません! ';
}
}
}

//抽象クラス
抽象クラス Hanzi
{
抽象 public function qinqin();
}

//Daisi クラス

class DDS extends Hanzi {
public function qinqin() {
echo '女の子にビンタさ​​れるのは、DDSの運命';
}
}

//背が高く、金持ちで、ハンサム

class GFS extends Hanzi {
public function qinqin() {
echo 'キスだけじゃなくて、また、バンバンバン、これは背が高く、金持ちで、ハンサムな男の運命です';
}
}

//かわいい女の子サブカテゴリ

クラスMengMeizi {}

$m = new Meizi;
$dds = new DDS;
$gfs = new GFS;
$mmz = new MengMeizi;

//受信オブジェクト
echo $m->meet($dds); // 実現DDS の効果
echo $m->meet($gfs); //GFS の効果を実現

//制限なし

echo $m->meet($mmz); //親戚にキスする方法!

@@ポリモーフィズムの 2 つの例:

./1.interfaces.php を通じてポリモーフィック アプリケーションを実装する
./2. 通常の class.php を通じてポリモーフィック アプリケーションを実装する
======= ====== =====================================

13. 例外処理:

新しいエラー処理があります。 php5 のメカニズム - 例外処理: (オブジェクト指向)
関係するクラス: Exception 例外クラス
例外クラスの構造:
class Exception
{
protected $message = '不明な例外' // 例外情報
protected $code = 0; // ユーザー定義の例外コード
protected $file; // 例外が発生したファイル名
protected $line; // 例外が発生したコード行番号

function __construct($ message = null, $code = 0);

Final function getMessage(); // 例外情報を返す

Final function getCode(); // 例外が発生したファイル名を返す

Final function getLine(); / 例外が発生したコード行番号を返します
Final function getTrace(); // backtrace() 配列
Final function getTraceAsString(); // 文字列にフォーマットされた getTrace() 情報

/* オーバーロード可能なメソッド* /
function __toString(); // 出力可能な文字列

}


使用法:
try{

throw new Exception("年齢は負の数にすることはできません") // 例外がスローされました

}catch(Exception $e){
/ /例外処理
echo $e->getmessage();
}

例:
function addUser($username) {

if($username="xiaobai") {

//追加が成功しました
}else {
/ /追加失敗
throw new Exception('追加失敗');
}
}

function updateUser($username) {
if($username = "xiaohei") {

//変更成功

}else {
//変更に失敗しました
throw new Exception('Modification failed');
}
}

try {
addUser('xiaobia');

updateUser('xiaohei');
}catch(Exception $e) {

echo '失敗メッセージは次のとおりです:'.$e->getMessage();
}

@@例外がキャッチされると、try() ブロックの後続のコードは続行されません 実行

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。