1. 程式人生 > >PHP面向物件深入理解之二(封裝、繼承、多型、克隆)

PHP面向物件深入理解之二(封裝、繼承、多型、克隆)

 1.封裝

 所謂封裝就是隱藏內部實現細節,提供外部訪問方式

 將一系列私有的特徵儲存起來

 class Person
 {
     private $ID;
     public function setID($id)
     {
         $this->ID = ($id + 1)*3;
     }
     public function getID()
     {
         return $this->ID;
     }
 }
 $wang = new Person();
 $wang->setID('123');
 //我們不去關心id是如何生成的,我們只需要拿到我們想要的,這就是封裝
 print $wang->getID();

2.繼承

繼承就是把父類的東西傳給下一代,就像中華文化一樣,代代相傳
注意:所有要被繼承的方法的方法名 不能和類名一樣 即使大小寫不同也不行


(1) 介面的繼承

介面自身也允許多繼承,但是父子之間方法不能同名

<?php
interface People
{
    public function age();
}
interface Human
{
    public function name();
}

interface Person extends Human,People
{
    public function gender();
}


類與介面之間允許多繼承

<?php 
interface A
{
	public function a();
}
interface B
{
	public function b();
}

/*
 * 可以同時例項化多個介面 解決單繼承問題
 */
class E implements A,B 
{
    const E1 = '15'; //類中常量使用
    static $e2 = 1;  //類中靜態變數使用
	public $e3 =2;   //類中普通成員變數使用
    public function __construct(){
        self::$e2++;
    }
    public function a(){
        echo 'E1:'.self::E1."\n";
    }
    public function b(){
        echo 'e1:'.self::$e2."\n";
    }
}
$e1 = new E();
$e1->a();
$e1->b();
$e2 = new E();
$e1->a();
$e1->b();
$e2->a();

(2) 抽象類/普通類的繼承

類只能實現單繼承
<?php
abstract class A
{
	public function $aa=1;
	abstract public function a1();
	public function aa()
	{
        echo 'aa';
	} 
}

class A2
{
	public function a1()
	{
	    echo 'a1';
	}
}
$a2 = new A2();
$a2->a1;

3. 多型


多型,同一個實體同時具有多種形式,從PHP上講,就是允許將子類型別的物件賦值給父類型別

來看一個栗子:

<?php 

abstract class Animal
{
	abstract public function say();
}

class Cat extends Animal
{
	public function say()
	{
	    echo 'maio';
	}
}
class Dog extends Animal
{
	public function say()
	{
	    echo 'wang';
	}
}

function said($animal)
{
	if($animal instanceof Animal){
	    $animal->say();
	}
}

said(new Cat());
said(new Dog());


4. 克隆

為什麼要把克隆放在這裡。PHP5中有個非常重要的改變,使用new關鍵字
new出的物件是一個指向物件控制代碼的id,當賦值給其他變數的時候,會有意想不到的結果
舉個栗子:
<?php 

class A
{
	public $aa = 2;
}

$a1 = new A();
$a2 = $a1;
$a3 = clone $a1;
$a1->aa = 5;
print $a2->aa,"\n";
print $a3->aa,"\n";

?>




結果是 3 5 


為什麼不是 3和3,這裡的$a2獲得的只是$a1物件的控制代碼(id),並不是物件的完整拷貝,所以,如果要使用物件的完整拷貝,請使用clone,以免獲得意想不到的結果。