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

  • 相关阅读:
    从应用到平台,云服务架构的演进过程
    从应用到平台,云服务架构的演进过程
    武汉小猫科技-工作总结(1):一图胜万言
    武汉小猫科技-工作总结(1):一图胜万言
    一个App带你学会Retrofit2.0,麻麻再也不用担心我的网络请求了!
    关于创业公司产品开发原则
    关于创业公司产品开发原则
    【Deep learning book】
    【NLP】word2vec
    【python】好书
  • 原文地址:https://www.cnblogs.com/sqyysec/p/6828717.html
Copyright © 2020-2023  润新知