PHP面向物件深入理解之二(封裝、繼承、多型、克隆)
阿新 • • 發佈:2019-02-15
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,以免獲得意想不到的結果。