【代码学习】PHP面向对象之封装与继承
一、封装(访问控制)
就是将属性私有,并提供公有的setter放置与getter取值方法
注:封装是进行访问控制,不是拒绝访问
public(公有) protected(受保护) private(私有)
===========================================================
在本类中 Y Y Y
在子类中 Y Y N
在类外边 Y N N
使用private关键字修饰就是实现了对成员的私有封装。封装后的成员在对象的外部不能直接访问,只能在对象的内部方法中使用 $this访问
1、设置私有属性
<?php class info { private $name; private $sex; private $age; public function __construct($name="SQYY", $sex="男",$age="1") { $this->name = $name; $this->sex = $sex; $this->age = $age; } //在类中声明一个走路的方法,调用两个内部的私有方法完成 function run() { echo $this ->name .'在走路时' .$this ->leftLeg() .'再' .$this ->rightLeg().'<br>'; } //声明一个迈左腿的方法,被封装,所以只能内部使用 private function leftLeg() { return "迈左腿"; } //声明一个迈右腿的方法,被封装,所以只能内部使用 private function rightLeg() { return "迈左腿"; } //实例化一个对象 $person1 = new info(); $person1 -> run(); //run没有被封装,可以在外部调用使用 $person1 -> name='李四'; //name属性被封装,不能再对象外部给私有属性赋值 $person1 -> leftLeg(); //leftLeg()方法被封装,不能在对象外面调用对象的私有方法 } ?>
2、私有成员的访问
<?php class Person { public $name; //第一个成员属性$name定义人的名字,此属性被封装 private $sex; //第二个成员属性$sex定义人的性别,此属性被封装 function __construct($name='SQYY',$sex='男'){ $this->name=$name; $this->sex=$sex; } public function setName($name ) { //通过此方法设置属性name的值 $this->name=$name; //为对象的私有属性赋值 } public function getName(){ //通过此方法获取属性name的值 return $this->name; //返回当前的私有名字属性 } public function setSex($sex) { //通过此方法设置属性sex的值 if($sex=="男" || $sex=="女") //如果传入合法的值才为私有的属性赋值 $this->sex=$sex; //条件成立则将参数传入的值赋给私有属性 } public function getSex(){ //通过此方法获取属性$sex的值 return $this->sex; //返回当前的私有性别属性 } public function info(){ echo '我的名字:' .$this -> name. ',我的性别:' .$this ->sex; } } $person1 = new Person('张三','女'); $person1 ->info(); //输出 我的名字:张三,我的性别:女 ?
如果没有使用private封装的成员属性,则可以随意被赋值。如果对私有的成员属性通过公有的方法访问,则可以在公有的方法加一些限制条件来达到封装的目的。
二、继承
继承的使用场景:当别人有 自己没有 去继承那个人的
继承的格式: class A extends B{}
当A类去继承了B类之后 A类中就拥有了B类中所有的成员属性和 成员方法,但是 除了私有成员之外
访问权限 public protected private
在类的外部 OK NO NO
在子类中 OK OK NO
1、继承属性(父类的私有成员只能在本类使用,子类不能访问)
<?php //声明一个类作为父类使用,将他的成员都声明为私有的 class Myclass{ public $var1 = 100; //声明一个私有的成员属性并赋值100 //声明一个成员方法,使用private关键字设置为私有 public function printHello(){ echo 'Hello<br>'; } } //声明一个子类Myclass类的子类师试图访问父类中的私有成员 class Myclass2 extends Myclass{ function useProperty(){ echo '输出从父类及成果来的成员属性值' .$this ->var1 .'<br>'; //访问父类中的私有属性 $this -> printHello(); //访问父类中的私有方法 } } $subObj = new Myclass2; $subObj -> useProperty(); ?>
2、单继承
PHP只支持单继承,不允许多重继承。一个子类只能有一个父类,但一个类可以被多个类继承。
如类B 继承了类A,类C又继承了类B,那么类C也间接继承了类A
<?php class P_H_P extends J_A_V_A{ public function php(){ echo "我正在编写php程序"; } } class J_A_V_A{ public function java(){ echo "我正编写java程序"; } } // 学生的类 class stu extends P_H_P{ } // 实例化对象 $stus = new stu(); $stus->php(); $stus->java(); ?>
3、子类中重载父类的方法
如果在子类中拥有一个和父类中同名的成员方法时,调用该方法 调用的是子类的成员方法 而不是父类中的
调用父类中被覆盖的成员方法: parent::方法名
<?php header('Content-type:text/html;charset=utf-8'); // 调用父类中的成员 //定义一个wifi define('WIFI',false); //父类 class Phone{ //成员属性 public $brand = "普通手机"; //成员方法 public function call(){ echo "我正在打电话呢"; } } //子类 class SmartPhone extends Phone{ //成员属性 public $brand = "智能手机"; // 成员方法 public function call(){ if(WIFI){ echo "我正在使用wifi打电话呢"; }else{ // 调用父类的方法 parent::call(); echo '怎么了?'; } } } // 实例化对象 $xm = new SmartPhone(); $xm->call(); ?>
当定义的WIFI为false时 输出 我正在打电话呢怎么了?
当第义的WIFI为true时 输出 我正在使用wifi打电话呢