这里有一个叫做“动物”的类:
01 |
<?php |
02 |
|
03 |
class animal{ |
04 |
|
05 |
public $name = 'cat';//动物的公共属性,内外部可以访问、赋值 |
06 |
|
07 |
public $sex = 'male'; |
08 |
|
09 |
public $voice = 'miao'; |
10 |
|
11 |
public function shout(){//动物的方法,内外部可以访问 |
12 |
|
13 |
echo $this->name;//调用属性时,不加再加$ |
14 |
|
15 |
echo ' says '; |
16 |
|
17 |
echo $this->voice; |
18 |
|
19 |
echo '<br />'; |
20 |
|
21 |
} |
22 |
|
23 |
} |
24 |
|
25 |
$animal = new animal; |
26 |
|
27 |
$animal->name = 'littleCat';//外部赋值 |
28 |
|
29 |
$animal->shout();//外部调用方法 |
30 |
|
31 |
echo $animal->sex;//外部访问属性 |
32 |
echo '<br />'; |
33 |
?> |
运行以上代码,将打印:
1 |
littleCat says miao |
2 |
male |
三大特性之一:封装
将上面第5行改成
1 |
private $name = 'cat';//动物的私有属性,内部可以访问、赋值,外部不行 |
那么,第27行出错,因为不能在外部赋值。删除第27行之后,将打印:
1 |
cat says miao |
2 |
male |
封装把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位(即对象)。比如张三是一个对象,谁能修改他的工资,谁能查看,谁不能查看,就是一个封装程度的问题。
三大特性之二:继承
在动物类第32行后继续插入
01 |
class dog extends animal{ |
02 |
|
03 |
public $name = 'dog';//重写原有属性 |
04 |
|
05 |
public $style = 'traditional';//新增属性 |
06 |
|
07 |
} |
08 |
|
09 |
$dog = new dog; |
10 |
|
11 |
$dog->shout(); |
12 |
|
13 |
echo $dog->style; |
14 |
|
15 |
echo '<br />'; |
有个叫做“狗”的类继承了“动物”类。这样,狗拥有动物的属性和方法,不用再写很长一段代码了(复制粘贴小修改当然可以“省事”,但要是有很多很多动物,就不划算了)。
此部分代码打印:
1 |
dog says miao |
2 |
traditional |
继承的类可以理解为被继承者的特殊化,因为它除了拥有父类的所有特性(属性和方法),还具备自己独有的个性(比如改写原有的,新增自己的)。
以上的打印结果出现了笑话,因为狗是不会“喵”的。继承适合B是A的特殊种类,而不是A包含B,因为A会的东西,B也都会了。所以正确的做法是不定义动物类的具体名字、性别、叫声,而是分别写两个类(猫和狗)来继承动物类。
三大特性之三:多态
多态表示不同的对象做相同的事,但要用自己的方法做。比如动物都要叫,但叫声不同。按照我的理解,就是“重写”二字。比如同是求面积,长方形和圆形的“方法”不同,这就是多态。
“PHP这种弱类形的面向对象的语言里面,多态的特性并不是特别的明显,其实就是对象类型变量的变项应用。”
参考资料
1 《大话设计模式》
2 PHP面向对象编程全面讲解 http://wenku.baidu.com/view/9a114460ddccda38376baf36.html