PHP面向对象深入理解之二(封装、继承、多态、克隆)

xiaoxiao2021-02-28  120

 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,以免获得意想不到的结果。

转载请注明原文地址: https://www.6miu.com/read-19515.html

最新回复(0)