zoukankan      html  css  js  c++  java
  • 4月26 关于类,对象以及面向对象三大特性之封装

    ---恢复内容开始---

    <?php
    //面向过程
    比如求一个圆的面积
    $r=5;
    $m=3.14*$r*$r;
    //当直接规定半径时这是很方便的但是当变量改变时会出现代码的重复
    ?>
    类和对象
    对象:能够见到的任何东西都可以称为对象, 也可以理解为类实例化出来的东西
    类: 对所有同类的对象抽象出来的东西

    举例理解类和对象:

    类:比如班级里面每个人相同的有学号,上课时间,休息时间,所上课程等;再比如说人所共有的姓名,性别,年龄等等,这些所公有的都可以统称为类;就像数据库没给表的第一行

    对象:具体到一条具体的信息 比如:p001,张三,男,汉族,1990-2-9等
    拿老师所讲的粉笔打比方:一盒粉笔的所有公有的会有颜色,长度等称为类,拿出一只粉笔是它的颜色长度是对象的信息

    <?php
    //定义类 不成文规定类的首字母必须要大写

    class Ren
    {
        var $name;
        var $age;
        var $sex; //成员变量
        var $nation;
      //var $sex ='男'; //没有错但是没有意义
        function Run() //成员函数(方法),c#中有成员属性但现在没有
      {
        echo "这个人正在跑步";
       }
        function Say()
       {
          echo "这个人正在说话";
       }
    }

    使用类
    //1.实例化对象 类不能直接使用
    $r = new Ren(); //初始化,从大类中新造一个人出来
    var_dump($r); //简单的使用,里面没有任何信息

    //2.给成员变量赋值 (调用成员变量)
    $r->name = '张三'; //给对象的name赋值,不加后面等号是取值
    $r->age = '23'; //同理
    echo $r->sex ;//不可以会出错,因为对象不属于类
    //var_dump($r);

    //3.调用成员方法
    $r->Run(); //执行成员方法
    $r->Say();

    ?>

    访问修饰符
    var 是任意类型的,
    1.如果需要加访问修饰符,需要去掉var
    2.共有三种public 代表公有的, protected 代表受保护的,只能在类和其子类中 private代表私有的只能是在类中使用别的不能
    3.如果不加访问修饰符默认公有的

    class Ren
    {
    public $name;
    protected $age;
    private $sex;
    var $nation;
    //var $sex ='男'; //没有错但是没有意义
    function Run()
    {
    echo "这个人正在跑步";
    }
    function Say()
    {
    echo "这个人正在说话";
    }
    }
    $r = new Ren();
    $r->name = '张三';
    $r->age ='20'; //出错
    $r->sex ='男'; //出错
    var_dump($r);

    ?>

    $this 引用
    this 是代表该对象的,也就是张三,那个对象调用就是代表谁,

    $this 代表该对象,(哪个对象调用),不代表该类

    <?php

    class Ren
    {
    public $name;
    protected $age;
    private $sex;
    var $nation;
    //var $sex ='男'; //没有错但是没有意义
    function Run() //成员函数(方法),c#中有成员属性但现在没有
    {
    echo "这个人正在跑步";
    }
    function Say()
    {
    echo $this->name."正在说话";
    $this->Run();
    }
    }
    $r = new Ren();
    $r->name = '张三';
    $r->Say();

    ?>

    构造函数 可以写也可以不写
    对类进行实例化的时候通过编译,造类时有构造函数不过被隐藏了,看不到的默认的
    c#是:public Ren(){}必须与类名相同
    特殊性写法特殊固定的两个下划线__construct()
    执行特殊,在造对象的时候最先执行,在new时自动执行
    作用:对对象执行初始化操作,

    <?php

    class Ren
    {
    public $name;
    protected $age;
    private $sex;
    var $nation;

    function __construct($s) //构造函数的写法
    {
    $this->nation = $s;//初始化sex,造对象执行 ,初始化时给参数
    }

    function Run()
    {
    echo "这个人正在跑步";
    }
    function Say()
    {
    echo $this->name."正在说话";

    }
    }
    $r = new Ren("汉族");
    var_dump($r);

    ?>

    以上是上午讲课的内容,下午主要是对析构函数,以及封装进行了较为全面的讲解,理解有些难度
    ,会慢慢的整理老师所讲的内容

    析构函数

    析构函数不需要任何的参数,php将在对象被销毁前自动调用这个方法
    写法是固定的__destruct(),是自动执行,对象销毁前

    <?php
    class Ren
    {
                  public $name;
                  public $sex;
                  public $age;
                  function __construct($s) //构造函数
                {
                      $this->sex =$s;
                }
                 function Say()
               {
                    echo "好好说话";
               }

                 function __destruct() //析构函数,对象销毁前执行
            {
                    echo "该对象被销毁了";
             }
    }
                  $r = new Ren("男");
                  $r->name ="张三";
                  $r->Say();//方法执行完面临销毁时自动执行destruct,不需要调用
    ?>

    面向对象的三大特效:封装,继承,多态
    封装
    目的:让类更安全,不让外界直接访问类里面的成员变量
    做法:1.把成员变量变成私有的 privat
            2.做一个方法来实现变量的取值或赋值,在方法里面加限制条件方法

    <?php

    class Ren
    {
                  private $name;
                  private $sex;
                  private $age;
                  function __construct($s) //构造函数
                 {
                           $this->sex =$s;
                  }
                 function Say()
                 {
                       echo "好好说话";
                  }
                     function SetAge($a)//给age赋值的函数,是需要参数的
              {
                       if($a>10 && $a<50)//给$a限制的条件,若是超出范围为null赋值没有成功,条件范围内可以
                   {
                         $this->age = $a;
                    }
            }
                   function GetAge()//取age的值的方法
                 {
                          return $this->age;
                  }
    }
    $r = new Ren("男");
    $r->SetAge(30);//只是简单的将age进行了赋值,但还没有控制范围,那时候要用if

    echo $r->GetAge();//赋值之后才可以取值,
    var_dump($r);

    ?>

    以上只是实现了对于age的封装,如果每个变量都那样的话会工作量较大代码较多,不易操作

    使用类里面提供的魔术方法也可以实现对私有成员的操作
    __set()特点:会自动执行,把赋值语句中的变量名作为第一个参数,把变量值作为第二个参数调用
    __set方法

    __get()特点:会自动执行,把取值语句中的变量名作为参数调用__get方法

    对类里面的私有成员进行赋值的魔术方法__set(),需要参数的

    <?php

                    class Ren
                  {
                            private $name;
                            private $sex;
                            private $age;
                            function __construct($s) //构造函数
                          {
                                  $this->sex =$s;
                          }
                           function Say()
                           {
                                  echo "好好说话";
                           }
                            function __set($name,$value) //对类里面的私有成员进行赋值的魔术方法__set()
                         {
                             //echo $name;//输出age,说明name就是age;下面调用的是谁输出的就是谁,可以取到变量名

                                     if($name == "age")
                           {
                                    if($value >10 && $value <50)
                                  {
                                           $this->$name =$value;
                                   }
                            }
                                        else
                            {
                                         $this->$name =$value;
                              }
                        }
                                         function __get($name)//对类里面的私有成员进行取值的魔术方法
                               {
                                                return $this->$name;
                                }
                      }

    $r = new Ren("男");

    //$this->变量名 = $value;
    $r->__set("name","张三");//这样是可以的但是需要每一次都要求去写set方法和变量名
    $r->name ="李四";//会自动调用__set()方法的,,,执行该语句会自动调用__set方法 讲没有set
    方法执行会报错
    $r->sex ="女";//__set()之所以称为魔术方法是因为每一个成员变量都可以使用,,,,,echo $name
    使用看谁的名字
    $r->age =40; //echo $name使用看谁的名字
    var_dump($r);

    echo $r->sex;//__get()的,不然把__get注释会不可以报错的
    echo $r->age;//上面set赋值后,取值

    ?>

    自己瞎琢磨的有点问题

    <?php

    class Ren
    {
    private $name;
    private $sex;
    private $age;
    function __construct($s) //构造函数
    {
    $this->sex =$s;
    }
    function Say()
    {
    echo "好好说话";
    }
    function __set($a,$value) //对类里面的私有成员进行赋值的魔术方法__set()
    {
    $this->$a= $value;
    }
    }

    $r =new Ren("男");
    $r ->__set("a","19");//产生一个新的变量$n 张三, 使用时变量名最好是成员变量里面的
    //$r->name ="李四";//会和之前一样的结果没有影响
    var_dump($r);

    ---恢复内容结束---

  • 相关阅读:
    Another option to bootup evidence files
    切莫低估了使用者捍卫个人隐私的强烈意志
    如何验证证书绑定?
    How to verify Certificate Pinning?
    iDevice取证的一大突破
    Do you know how many stuff inside your Google Account?
    Use LiveCD to acquire images from a VM
    完成评论功能
    从首页问答标题到问答详情页
    首页列表显示全部问答,完成问答详情页布局。
  • 原文地址:https://www.cnblogs.com/Duriyya/p/5444443.html
Copyright © 2011-2022 走看看