类的封装性和继承
Posted zhony
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类的封装性和继承相关的知识,希望对你有一定的参考价值。
面向对象思想已经存在了好多年了,php之前没有面向对象,是PHP开发者后期加上的。
面向对象思想有三大特征,封装,继承,多态,其中多态并不适用于PHP。
之前使用的是public关键词,它的意思是公开的,意思就是只要拿到这个类,谁都可以使
用,谁都可以赋值调用,重新赋值调用。
封装:即禁止某些方法/属性 ,不充许外部调用。并开放部分方法 ,来间接调用。
比如 银行的 ATM, 你可以输入密码 " 检测 " 用户的密码是否正确, 但不能 " 查询 " 用户的密码。
代码 :
1 class ATM{ 2 //protected 受保护的,只允许本类内部使用,外部方法调用。设置了外部无法访问的权 3 限。 4 protected function getPass(){ 5 return ‘123456‘; 6 } public function checkPass($pass){ 7 return $pass == $this->getPass(); 8 }}$atm = new ATM(); 9 $atm = checkPass(‘1234456‘); 10 $atm->getPass(); //出错
以上如果用面向过程的函数来开发,则比较难实现屏蔽的功能。
以上是方法的封装,设置关键词protected关键词,受保护的,可以有效防止外部调用,但内部又可
以使用的策略,同样的方法适用于属性。
1 <?php 2 //面向对象的封装 3 //public private 4 5 class A{ 6 public $name = ‘加州‘; 7 //只能在自己和家族范围访问 不能在外部范围访问 8 protected $sex = ‘郑州‘; 9 public function test(){ 10 echo $this->sex; 11 } } $p = new A; 12 //可以输出,因为是public公开的。 13 echo $p->name; 14 //不能输出,设置了protected受保护的,外部方法调用。 15 //echo $p->sex; 16 //但如果我就想输出怎么办? 17 //可以利用test方法,因为test方法属于A类,让test本类中的方法去调用本类的属性。 18 $p->test();
以上我们总结一下:
public 公开的,类内部,外部均可调用。
protected 受保护的,内部可调用,外部无法调用。
另外还有一种,private 私有的,除了自己其他都无法访问
网上有人给我们提供了 一个mysql 类 , 我们可以直接new使用。
但我如果觉得这个类的某个方法不好 , 或者缺少某个方法 , 怎么办?
类继承的语法:
1 class A{ 2 public function youQian(){ 3 echo "老子有钱"; 4 } 5 }//使用extends关键词继承。 6 // class 子类(用户定义的) extends 父类(现有的类){} 7 class Aa extends A{ 8 public function qiong(){ 9 echo "我是真的穷"; 10 } 11 }//子类继承父类以后,父类的方法可直接使用。 12 $erzi = new Aa(); 13 $erzi->youQain(); 14 $erzi->qiong();
如果重名会怎么样?
1 class A{ 2 public function youQian(){ 3 echo "老子有钱"; 4 } 5 }//使用extends关键词继承。 6 // class 子类(用户定义的) extends 父类(现有的类){} 7 class Aa extends A{ 8 public function youQian(){ 9 echo "我比你更有钱"; 10 } 11 }//子类继承父类以后,父类的方法可直接使用。 12 $erzi = new Aa(); 13 //如果重名,会直接输出子类的方法,这在PHP面向对象中叫覆盖重写。 14 $erzi->youQain();
所以,看需求,你觉得原来的类中,有个方法不好用,可以继承以后重写,有人问,那我直接在原
基础的类上直接修改不行吗?干嘛还要继承以后再重写?
class A{ public function youQian(){ echo "老子有钱"; } public function benShi(){ echo "老子不光有钱,本事才是最重要的"; } }//使用extends关键词继承。 // class 子类(用户定义的) extends 父类(现有的类){} class Aa extends A{ public function youQian(){ echo "我?你更有钱"; } }/* 注意:虽然我们觉得A类中,youQian()这个方法不太好,我希望重写,但一个类中不只有一个 类,还有大量的其他的方法,这些?法我觉得都很好,所以我想既要留着其他的方法供我使用,我 还想重写youqian这个方法。 */ //子类继承父类以后,父类的方法可直接使用。 $erzi = new Aa(); //如果重名,会直接输出子类的方法,这在PHP面向对象中叫覆盖重写。 $erzi->youQain();
不仅如此,继承以后,还可以在?类中继续新增方法,在原有的基础上,可以无限扩充你想要的功
能:
1 class A{ 2 public function youQian(){ 3 echo "有钱"; 4 } 5 6 public function benShi(){ 7 echo "不光有钱,本事才是最重要的"; 8 } 9 } 10 //使用extends关键词继承。 11 // class 子类(用户定义的) extends 父类(现有的类){} 12 class Aa extends A{ 13 public function youQian(){ 14 echo "我比你更有钱"; 15 } 16 17 public function genBenShi(){ 18 echo "我比老爷子更有本事"; 19 } 20 }/* 21 注意:虽然我们觉得A类中,youQian()这个?法不太好,我希望重写,但一个类中不只有一个 22 类,还有大量的其他的方法,这些方法我觉得都很好,所以我想既要留着其他的方法供我使用,我 23 还想重写youqian这个方法。 24 */ 25 //子类继承父类以后,父类的方法可直接使用。 26 $erzi = new Aa(); 27 //如果重名,会直接输出子类的方法,这在PHP面向对象中叫覆盖重写。 28 $erzi->youQain(); 29 //调用自己写的方法 30 $erzi->genBenshi();
继承的好处:
子类可以继承父类的属性及方法 , 并允许覆盖父类的方法或新增方法
通过自然界的比喻就是,通过"进化"来获得新特性,同时不影响旧物种。
注意:
PHP的继承是单继承。
一个子类只能继承一个父类。
但可以形成孙子继承。
1 <?php 2 class A{ 3 4 } 5 class B{ 6 } 7 class C extends A{ 8 9 10 } 11 class C extends B{ 12 } 13 //PHP是单继承,一个子类只能继承一个父类,不能有两个爹。 14 $aa = new C();
形成孙子继承:
1 <?php 2 //自类继承父类中的所有内容 3 4 class A{ 5 public function sayA(){ 6 echo $this->name; 7 } } //不仅仅是可以向下 也可以向上 8 class B extends A{ 9 // A 里面的sayA C里面的sayC 这两个方法都可以访问B类里面的受保护的属 protected $name =‘满身大汉‘; 10 } class C extends B{ 11 public function sayC(){ 12 echo $this->name; 13 } } $p = new C; 14 $p->sayC(); 15 $p->sayA();
不仅如此,PHP的继承还可以有多个儿子。
1 <?php 2 class A{ 3 4 } 5 class C extends A{ 6 7 8 } 9 class D extends A{ 10 } 11 //PHP是单继承,但可以有多个儿子。 12 $aa = new C();
以上是关于类的封装性和继承的主要内容,如果未能解决你的问题,请参考以下文章