面向对象思想已经存在了好多年了,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 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
形成孙子继承:
1 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