PHPオブジェクト指向の本質

WBOY
リリース: 2016-08-08 09:32:20
オリジナル
863 人が閲覧しました

1 extends を使用して、継承、オーバーロード、マジックメソッドの意味を理解します

クラス B は A を拡張します

宣言するとき、B は A にメソッドを持つ必要はありません

呼び出すときは、$b=new B();

$b ->A() のメソッド;

$b->A=1 の属性;

$b->B() のメソッド;

$b->B() のメソッド;

If $a=new A();

Yes

$a->A()のメソッド;

$a->A=1の属性;

不可能

$a-> ;Method() in B;

$a->Method() in B;

オーバーロード: B は A を継承し、B は A と同じ名前のメソッド属性を実装します。 PHP の

オーバーロード」は、他のほとんどのオブジェクト指向言語とは異なります。従来の「オーバーロード」は、同じ名前の複数のクラスメソッドを提供するために使用されますが、各メソッドは異なるパラメーターの型と数を持ちます。

マジック メソッド: PHP は、__ (2 つのアンダースコア) で始まるすべてのクラス メソッドをマジック メソッドとして扱います。したがって、独自のクラス メソッドを定義する場合は、先頭に __ を付けないでください。

2 private および protected アクセス修飾子の可視性を継承します

プライベート プロパティ メソッドは継承できません

protected プロパティ メソッドはクラスの外部には表示されませんが、継承できます

パブリック プロパティ メソッド 定義されたクラス メンバーはどこにでも配置できます

を参照してください

3 phpにおける二重コロン::の応用例

PHPのクラスコードでよく見かける「::」演算子は、二重コロン「::」で表されるスコープ制限演算子です。スティッキー クラス内のさまざまなスコープのレベル。左側はスコープ、右側はアクセス スコープのメンバーです。

php には self とparent という 2 つのスコープが定義されています (静的スコープは php6 で提供されます)。

範囲解決演算子 (Paamayim Nekudotayim とも呼ばれます)、またはもっと単純にコロンのペアを使用して、静的メンバーメソッド、および定数にアクセスでき、サブクラスでも使用できます親クラスのメンバーとメソッドをオーバーライドすることもできます

クラスMyClass{
const
CONST_VALUE='定数値';
}
echo
MyClass:: CONST_VALUE;

classoterclassmyclass
{
publicstatic
$ my_static :
CONST_VALUE "n";
echo n"
; }}
OtherClass ::doubleColon(); //サブクラスのオーバーライド親クラス
class MyClass{ protected function myFunc " MyClass::myFunc()n"
;
}
}
class OtherClass 拡張MyClass
{

// 親クラスのメソッドをオーバーライドします

public function
myFunc
()
" OtherClass::myFunc()n"

4 this と PHP での self そして の役割parent
this: これは、他のオブジェクトやクラスへのポインターではなく、現在のオブジェクト インスタンスへのポインターです。 self: 現在のクラスのスコープを表します。これとは異なり、クラスの特定のインスタンスを表すものではなく、クラス外のコードで Self を使用することはできず、継承の階層内での自身の位置を識別することもできません。つまり、self が拡張クラスで使用される場合、親クラスのメソッドではなく、拡張クラスのオーバーロードされたメソッドが呼び出されます。 self はクラス自体を指します。つまり、self はインスタンス化されたオブジェクトを指しません。一般に、self はクラス内の静的変数を指すために使用されます。

private static $firstCount = 0;
private $lastCount;
//コンストラクター関数
function __construct()
lastCount = ++self:$firstCount; //self を使用して静的変数を呼び出します。self 呼び出しでは以下を使用する必要があります。 (ドメイン演算子記号)
}

parent: 現在のクラスの親クラスのスコープを示し、それ以外はself属性と同じです。 parent は親クラスへのポインタです。通常、parent を使用して親クラスのコンストラクタを呼び出します。 // 継承クラスのコンストラクター

Function __ConStruct ($ personsex, $ Personage) { Parent :: __ Construct ("test") // Parent を使用して親クラスのコンストラクターを呼び出します $ This- & GT; = $personSex;

$this->personAge = $personAge;

}


5 コンストラクターとデストラクター

コンストラクターを持つクラスは、オブジェクトが作成されるたびに最初にこのメソッドを呼び出すため、非常に適しています。オブジェクトを使用する前に初期化作業を行います。

function

__construct

() {}

コンストラクターがサブクラスで定義されている場合、その親クラスのコンストラクターは秘密裏に呼び出されません。親クラスのコンストラクターを実行するには、子クラスのコンストラクターで

parent::__construct() を呼び出す必要があります。
PHP 5 では、C++ などの他のオブジェクト指向言語と同様に、デストラクターの概念が導入されました。デストラクターは、オブジェクトへのすべての参照が削除されるか、オブジェクトが明示的に破棄されるときに実行されます。

function __destruct() {}

6 Final キーワード PHP 5 では新しい Final キーワードが追加されています。親クラスのメソッドがfinalと宣言されている場合、サブクラスはそのメソッドをオーバーライドできません。クラスがfinalと宣言されている場合、そのメソッドは継承できません。
7 継承とコンストラクター

親クラス

サブクラス結果親コンストラクターサブ構造
コンストラクターあり コンストラクターなし
コンストラクターあり コンストラクターがあります

8 インターフェース

標準クラスを定義するのと同じように、インターフェースを通じてインターフェースを定義できます。

注:

1) ただし、その中で定義されているメソッドはすべて空です。

2) インターフェースで定義されているすべてのメソッドは public である必要があります。これはインターフェースの特性です

3) 複数のメソッドを実装します。インターフェースが存在する場合、インターフェース内のメソッドは同じ名前を持つことはできません4)

extends演算子を使用してインターフェースを継承することもできます5) インターフェース内で定数を定義することもできます。 。インターフェイス定数とクラス定数はまったく同じように使用されます。 これらはすべて固定値であり、サブクラスやサブインターフェイスによって変更することはできません。

//「iTemplate」インターフェイスを宣言します


interface
iTemplate
{
Public function
setVariable
($name, $var); パブリック関数
getHtml
($template);}

// インターフェースを実装します // 以下の記述は正しいです
class
Template
implements iTemplate {
プライベート
$vars
= array(); パブリック関数
setVariable
($name, $var) {$this
->
vars[$name ] = $var; } パブリック関数
getHtml
(
$template) ) { str_replace
(
'{' . $name . '}', $value $テンプレート
); }} 9 プロパティ クラスの変数メンバーは「プロパティ」と呼ばれ、プロパティ宣言はキーワード public または protected
または
private
で始まり、その後に続きます。変数。 属性内の変数は初期化できますが、初期化される値は定数である必要があります。ここでの定数は、コンパイル段階後の実行段階で計算される定数ではなく、PHP スクリプトがコンパイル段階にある定数を指します。
PHP5 では、属性を取得して割り当てるための 2 つの関数「__get()」と「__set()」、および属性を確認するための「__isset()」と属性を削除するための「__unset()」が事前定義されています。 」。

簡単に言うと、1 つは値を取得すること、もう 1 つは値を割り当てることです。 2 つのメソッド「__set()」と「__get()」、これら 2 つのメソッドはデフォルトでは存在しませんが、コンストラクター メソッド (__construct()) と同様に手動でクラスに追加されます。もちろん、これら 2 つのメソッドを次のように追加することもできます: //__get() メソッドはプライベート属性を取得するために使用されます

普通のコピー クリップボードに

  1. class person{
  2. //以下は人物のメンバー属性です
  3. private $名前; // その人の名前
  4. プライベート $sex // その人の性別
  5. プライベート $年齢; //年齢人
  6. //__get() メソッドはプライベート プロパティを取得するために使用されます
  7. private function __get($property_name){
  8. if (isset( $this->$property_name)){
  9. return($this->$property_name );} else {
  10. return(NULL);
  11. }
  12. }
  13. //__set() メソッドを使用して設定します私有地
  14. private
  15. function __set($property_name, $value){ $this->
  16. $プロパティ名 = $値 ; }
  17. //__isset() メソッド
  18. private
  19. function __isset($nm ){ エコー
  20. "ISSET()プライベートメンバーを測定する場合、自動的に呼び出します; br> } //__unset() メソッド
  21. private function __unset($nm){ echo
  22. 「unset( )クラスの外で< br> ";プライベートメンバーを削除するときに自動的に呼び出されます
  23. }$p1
  24. =newperson();$p1 ->name=「これは人の名前です」
  25. ; // isset () 関数を使用すると、プライベート メンバーを測定するときにタスクを完了するのに役立ち、結果が返されます。それは本当です
  26. echo var_dump(isset($p1->name)). "
    "echo
  27. $p1
  28. ->name."
    "
  29. ; // unset() の使用 関数がプライベート メンバーを削除すると、削除を完了するために自動的に __unset() メソッドが呼び出されます。 name のプライベート属性
  30. unset($p1->name); // が削除されているため、この行の出力はありません
  31. echo
  32. $p1->name; [php] ビュー プレーンコピー
    1. class person{ //以下は個人のメンバー属性です private $name //個人の名前 private $sex; private $age; //person age //__get() メソッドはプライベート プロパティを取得するために使用されます private function __get($property_name){ if(isset($this->$property_name)){ return($this-> $property_name);}else
    2. { return(NULL); } } } //__set() メソッドは、プライベート プロパティを設定するために使用されます private function __set($property_name, $value){ $this->$property_name = $ value; } //__isset() メソッド private function __isset($nm){ echo "isset() 関数はプライベート メンバーの測定時に自動的に呼び出されます
      return isset($this->) ;$nm); } / /__unset() メソッドのプライベート関数
    3. __unset($nm){ echo" unset() 関数が外部で使用されると自動的に呼び出されます。プライベートメンバーを削除するクラス<"; unset($this->$nm); } } $p1=newperson(); $p 1- >name=「これは人の名前です」; // isset() 関数を使用してプライベートメンバーを測定する場合、__isset() メソッドが自動的に呼び出されます。それを完了すると、戻り結果は true echo var_dump(isset ($p1->name))."
      "; echo $p1->name."
      "; unset() 関数を使用してプライベートメンバーを削除します。__unset(() が自動的に呼び出されます) メソッドを使用して完了し、名前プライベート属性を削除します
      unset(
    4. $p1
    5. ->name); / は削除されているため、この行には出力はありません echo $p1- >name ?> 10 オブジェクトのコピーは clone キーワードによって完了できます。 __clone() メソッドがオブジェクト内に存在する場合、それが最初に呼び出されます)。オブジェクト内の __clone() メソッドを直接呼び出すことはできません。
    6. オブジェクトがコピーされると、PHP5はオブジェクトのすべてのプロパティに対して「
    浅いコピー

」を実行します。すべての属性の

参照は変更されずに残り
、元の変数を指します。 __clone() メソッドが定義されている場合、新しく作成されたオブジェクト (コピーによって生成されたオブジェクト) の __clone() メソッドが呼び出され、(必要に応じて) 属性の値を変更するために使用できます。

11 PHP リファレンス

は、変数、関数、オブジェクトなどの前に & 記号を追加することですPHP の
引用符は、異なる名前が同じ変数の内容にアクセスすることを意味します。
は、C 言語のポインターとは異なります。 C言語のポインタは、変数の内容がメモリに格納されているアドレスを格納します
変数リファレンス
PHPのリファレンスでは、2つの変数を使用して同じ内容を指すことができます
[php]

$a="ABC";
$b =&$a;
echo $a;//ここに出力: ABC
echo $b;//ここに出力: ABC
$b="EFG";
echo $a;//ここの$aの値がEFGになるのでEFGが出力される
echo $b;//ここにEFGが出力される
?> ;
[/php]
アドレスによる関数呼び出し
アドレスによる呼び出しについては詳しくは説明しません
[php]
function test( &$a)
{
$a=$a+100;
}
$b=1;
echo $b;//出力1
test($b) ; //ここで $b が渡されます 実際に関数に与えられるのは、$b の変数の内容が配置されているメモリアドレスです。関数内で $a の値を変更することで、$b の値を変更できます
echo "
";

echo $b ;//Output 101
[/php]
ここでtest(1);を使用するとエラーが発生することに注意してください。理由は自分で考えてください
関数の参照戻り
まずはコードを見てください
[php]
function &test()
{
static $b=0;//静的変数を宣言します
$b=$b+1;
echo $b;
return $b;
}
$a=test();//このステートメントは、 value of $b as 1
$a=5;
$a=test() ;//このステートメントは、$b の値を 2
$a=&test();//これステートメントは $b の値を 3
$a=5;
$a =test();//このステートメントは $b の値を 6
[/php]
として出力します以下の説明:
このように、$a=test(); が実際に取得するものは、関数の参照戻りと通常の関数呼び出しと何ら変わりません。 理由: これは PHP の規定です
PHP では、関数の参照戻り値は $a=&test(); を通じて取得されると規定されています。
参照とは何かということについては、戻り値についてはどうでしょうか (PHP マニュアルには次のように書かれています: 参照戻り値は、関数を使用して次のことを行う場合に使用されます)参照をバインドする必要がある変数を見つけます。) このナンセンスのために、私は長い間理解できませんでした
上の例を使って説明してください
$a=test() を使用して関数を呼び出すと、値が代入されるだけです関数の $a への変更は、関数内の $b には影響しません
そして、関数を呼び出す $a=&test( ) メソッドを通じて、その関数は $b のメモリ アドレスをポイントすることです変数は $b と $a 変数のメモリアドレスを同じ場所に返します
、これと同等の効果が生じます ($a=&b ;) したがって、$a の値を変更すると $b の値も変更されます, したがって、
$a=&test();
$a=5;
を実行すると、$bの値は5になります
ここでは、静的変数は、実際、関数の参照戻り値は主にオブジェクト内で使用されます。 b;
echo $b->abc;//ここにABCを出力
echo $c->abc;//ここにABCを出力
$b->abc="DEF";
echo $c->abc;//ここにDEFを出力
?>
[/php]
上記のコードはPHP5での実行効果です
PHP5では、オブジェクトのコピーは参照を通じて達成されました。上記の列の $b=new a; $c=$b; は、実際には $b=new a; $c=&$b; と同等です
PHP5 のデフォルトでは、オブジェクトを参照によって呼び出すことになります。オブジェクトのコピーを作成し、元のオブジェクトへの変更がコピーに影響しないようにしたい場合があります。この目的のために、PHP は __clone という特別なメソッドを定義します。
参照の役割
同じオブジェクトを参照する変数が多数あり、そのオブジェクトを使用した後に手動でクリアしたい場合は、個人的には、「&」メソッドを使用してから、$var=null を使用してそれをクリアすることをお勧めします。また、php5 で大きな配列を転送する場合は、メモリ領域を節約できるため、「&」メソッドを使用することをお勧めします。
参照解除
参照の設定を解除すると、変数名と変数の内容の間のバインドが解除されるだけです。これは、変数の内容が破壊されることを意味するものではありません。例:

$a = 1;
$b =& $a;
unset ($a);
?> $b の設定を解除し、$a だけを設定します。
グローバル参照
global $var で変数を宣言すると、実際にはグローバル変数への参照が作成されます。これは、

$var =& $GLOBALS["var"];
?> を実行するのと同じです。これは、たとえば、 unset $var は次のことを意味します。グローバル変数の設定を解除しないでください。

$this オブジェクトのメソッドにおいて、$this は常にそれを呼び出すオブジェクトへの参照です。
//ここでまたちょっとしたエピソードです​​
PHP におけるアドレスのポインティング (ポインタに似た) 関数はユーザー自身によって実装されるのではなく、PHP の参照は「コピーオン」を使用します。 -write" 原則として、書き込み操作が発生しない限り、同じアドレスを指す変数やオブジェクトはコピーされません。
わかりやすく言うと
1: 次のコードがあるとします
[php]

$a="ABC";$b=$a;
[/php] ]
実際、この時点では $a と $b が異なるメモリを占有するのではなく、同じメモリ アドレスを指します
2: 上記のコードに次のコードを追加すると
[ php]

$a="EFG";[/php]
$a と $b が指すメモリ内のデータが書き換えられるため、Zend コアが自動的に Produce を決定します。 $a のデータを $b にコピーし、ストレージ用にメモリを再適用します
以上、オブジェクト指向 PHP の本質を内容も含めて紹介しましたが、PHP チュートリアルに興味のある友人の参考になれば幸いです。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート