类的封装性和继承

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();

 




















以上是关于类的封装性和继承的主要内容,如果未能解决你的问题,请参考以下文章

关于类的理解

面向对象的封装性和多态性

C++部分习题

面向对象三大特征

继承知识总结

java面对对象