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{
constCONST_VALUE='定数値';
}
echoMyClass:: 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 private static $firstCount = 0; Function __ConStruct ($ personsex, $ Personage) { Parent :: __ Construct ("test") // Parent を使用して親クラスのコンストラクターを呼び出します $ This- & GT; = $personSex; } parent::__construct() を呼び出す必要があります。 function __destruct() {} 6 Final キーワード PHP 5 では新しい Final キーワードが追加されています。親クラスのメソッドがfinalと宣言されている場合、サブクラスはそのメソッドをオーバーライドできません。クラスがfinalと宣言されている場合、そのメソッドは継承できません。 8 インターフェース 標準クラスを定義するのと同じように、インターフェースを通じてインターフェースを定義できます。 注: 1) ただし、その中で定義されているメソッドはすべて空です。 2) インターフェースで定義されているすべてのメソッドは public である必要があります。これはインターフェースの特性です 3) 複数のメソッドを実装します。インターフェースが存在する場合、インターフェース内のメソッドは同じ名前を持つことはできません4) extends演算子を使用してインターフェースを継承することもできます5) インターフェース内で定数を定義することもできます。 。インターフェイス定数とクラス定数はまったく同じように使用されます。 これらはすべて固定値であり、サブクラスやサブインターフェイスによって変更することはできません。 // インターフェースを実装します // 以下の記述は正しいです
普通のコピー
クリップボードに 参照は変更されずに残り 11 PHP リファレンス は、変数、関数、オブジェクトなどの前に & 記号を追加することですPHP の
myFunc ()
" OtherClass::myFunc()n"
4 this と PHP での self そして の役割parentthis: これは、他のオブジェクトやクラスへのポインターではなく、現在のオブジェクト インスタンスへのポインターです。 self: 現在のクラスのスコープを表します。これとは異なり、クラスの特定のインスタンスを表すものではなく、クラス外のコードで Self を使用することはできず、継承の階層内での自身の位置を識別することもできません。つまり、self が拡張クラスで使用される場合、親クラスのメソッドではなく、拡張クラスのオーバーロードされたメソッドが呼び出されます。 self はクラス自体を指します。つまり、self はインスタンス化されたオブジェクトを指しません。一般に、self はクラス内の静的変数を指すために使用されます。
private $lastCount;
//コンストラクター関数
function __construct()
lastCount = ++self:$firstCount; //self を使用して静的変数を呼び出します。self 呼び出しでは以下を使用する必要があります。 (ドメイン演算子記号)
}
5 コンストラクターとデストラクター
コンストラクターを持つクラスは、オブジェクトが作成されるたびに最初にこのメソッドを呼び出すため、非常に適しています。オブジェクトを使用する前に初期化作業を行います。
function
PHP 5 では、C++ などの他のオブジェクト指向言語と同様に、デストラクターの概念が導入されました。デストラクターは、オブジェクトへのすべての参照が削除されるか、オブジェクトが明示的に破棄されるときに実行されます。
7 継承とコンストラクター結果
親コンストラクター
コンストラクターあり
コンストラクターなし
サブ構造
コンストラクターあり コンストラクターがあります
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() メソッドはプライベート属性を取得するために使用されます
"echo
"
浅いコピー
return isset($this->) ;$nm); } / /__unset() メソッドのプライベート関数
"; echo $p1->name."
"; unset() 関数を使用してプライベートメンバーを削除します。__unset(() が自動的に呼び出されます) メソッドを使用して完了し、名前プライベート属性を削除します unset(
、元の変数を指します。 __clone() メソッドが定義されている場合、新しく作成されたオブジェクト (コピーによって生成されたオブジェクト) の __clone() メソッドが呼び出され、(必要に応じて) 属性の値を変更するために使用できます。
引用符は、異なる名前が同じ変数の内容にアクセスすることを意味します。
は、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 チュートリアルに興味のある友人の参考になれば幸いです。