これまで、オブジェクト指向の学習は暗記に限定されていましたが、これほど長い間働いてきた後、振り返ってみると、誰もが注目できる新しい洞察が得られました。
1.final
final: php5 は新しい Final キーワードを追加します。親クラスのメソッドがfinalと宣言されている場合、サブクラスはそのメソッドをオーバーライドできません。クラスがfinalと宣言されている場合、そのメソッドは継承できません。
コードをコピーします コードは次のとおりです:
class BaseClass{
public function test(){
ehco "test";
}
echo "moretest";
}
}
class ChildClass extends BaseClass{
public function moreTest(){
echo "moretest";
}
}
// 致命的なエラーを生成: 最終メソッド BaseClass::moretest() をオーバーライドできません
2.__toString (PHP5.2以降を使用することをお勧めします)
コードをコピーします コードは次のとおりです:
class person{
protected $name;
protected $email ; = new Person;
$rasums->setName('test');
$rasums->setEmail('test@qq .com');
print $rasums;
3. インターフェイスと抽象クラス
インターフェイスの役割: クラスが特定の名前、可視性、およびプロトタイプを持つ 1 つ以上のメソッドを実装していることを確認したいと考えています。
インターフェイスの要件:
的 すべての抽象メソッド
抽象メソッド Money は、ABSTRACT
インターフェイスの抽象メソッド属性を PUBLIC
メンバー属性に追加する必要はありません
インターフェイス ChildTest{
パブリック関数 childTest( );
}class FathTest は ChildTest1,ChildTest2 を実装します{
public function childTest(){ echo 1; }
…………
}
抽象化の役割: 実際、抽象クラスとインターフェイス クラスは部分的に抽象クラスはクラスに似ている部分を抽出するという文をどこかで読んだのを覚えています。この文は、実際には、多くのクラスが多くのメソッドを使用していることがわかります。 「クラスを書き換えることはできないし、各パブリック クラスには独自のインスタンスがある」「このパブリック クラスを作成して同じメソッドを呼び出す」ということも可能です。実際、これは抽象クラスが行うことですが、インスタンス化の手順が省略されるため、このメソッドを直接呼び出すことができ、このメソッドをオーバーロードすることもできます。
抽象化の要件:
クラス内に少なくとも 1 つの抽象メソッドが必要です
抽象メソッドは abstract を追加する必要があります
例:
コードをコピーします
コードは次のとおりです:
抽象クラス Database{
抽象関数 connect ();
抽象パブリック関数 query();
抽象パブリック関数 fetch();
抽象パブリック関数 close();
}
注: 抽象メソッドは継承する必要があるため、プライベート メソッドまたは Final メソッドとして定義できません。
4. オブジェクト参照を渡す
php4: すべての「=」はコピーを作成します
php5: オブジェクトを除き、他の「=」が割り当てられている場合、それらはコピーを作成し、オブジェクトは参照になります
5. クローンオブジェクト
1.
集約クラス:
__callメソッドの紹介:
クライアントコードがクラス内で未定義のメソッドを使用すると、__callが呼び出されます。
__call() は 2 つのパラメータを受け入れます。1 つはメソッド名で、もう 1 つは呼び出されるメソッドに渡されるすべてのパラメータ (配列を含む) です。
__call() メソッドによって返される値はすべて、あたかもクライアントに返されるかのように返されます呼び出しメソッドは実際に存在します
例:
コードをコピーします コードは次のとおりです:
class Address{
protected $city;
protected $country;
public function setCity($city){$this->city = $city;}
public function getCity(){return $this->city;}
public function set Country($country){$this->gt; country = $country;}
public function get Country(){return $this->country;}
}
class Person{
protected $name;
protected $address;
//浅いクローン
public function __construct(){
address = new Address;
}
public public function setName($ name)$ this-> name;
パブリック関数 __call($method,$arguments){
if(method_exists($this->address,$method)){
return call_user_func_array(array($this->address,$method),$arguments); ️ディープ クローン
$test1 = 新しい人;
$test2 = クローン $test1;
$test1->setName('testname1');
$test1->setCity('testcity1');
$test2->setName('testname2');
$test2->setCity('testcity2' );
echo $test1->getName().'-'.$test1->getCity()."n";
echo $test2->getName().'-'.$test2->getCity( )."n";
//testname1-testcity2
//testname2-testcity2
6. 重要な属性アクセス (__set __get __isset __unset) __isset __unset5.1 は
関数の後にのみ有効です: アクセスをインターセプトします属性の要件に合わせて、分離の度合いを改善するために、__isset() と __unset() も実装する必要があります。これにより、isset を使用して属性を検出したり、unset() を使用して属性を削除したりするときに、例:
コードをコピーします
コードは次のとおりです:
class person{
protected $__data = array('email','test');
public function __get($property){
if(isset($this->__data[$property])){
return $this->__data[$property];
}else{
return false;
}
}
public function __set($property,$value){
if(isset($this->__data[$property])){
return $this->__data[$property] = $value;
}else{
return false;
}
}
public function __isset($property){
if(isset($this->__data[$property])){
return true;
}else{
return false;
}
}
public function __unset($property){
if(isset($this->__data[$property])){
return unset($this->__data[$property]);
}その他{
return false;
}
}
}
$test = 新しい人;
$test->email= 'test';
var_dump($test->email);
注意:
这两个方法のみ捕捉缺少的属性,如果伝統的なクラスには 1 つのプロパティがありますが、このプロパティを許可する場合、php は __get() と __set(); を使用しません
この 2 つの方法は、プロパティに継承されているアイデアを完全に破壊します。 __get() メソッド,而して子类中又实现了自己的 __get() メソッド,那么你的対象オブジェクト不会正确的行動,故に父类的 __get() メソッド永远会被调用,当然使用可能親:: __ get()解决
解决:
速度相对慢使用魔术魔术魔术方法就就不可能プロパティ
http://www.bkjia.com/PHPjc/327149.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/327149.html技術記事
以前は、オブジェクトに向かうのはハードバックタイプに限定されており、これを長く続けて、戻って、また翻訳を見て、提供します。
🎜🎜