【代码学习】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打电话呢

posted @ 2017-05-09 01:55  水清云影  阅读(510)  评论(0编辑  收藏  举报