面向对象的三大特性

//面向对象的三大特性:①封装②继承③多态

//运用封装方法复杂很多但还使用其目的是:为了控制用户的输入或者用户的取值,让类更加的安全。

//做法:

//  1.将成员变量变为私有(将类里面的public改为private,使外界访问不到,增加了其安全性。)

//  2.做一个成员方法来间接访问类里面的变量。(运用function  setAge()来访问或者赋值给成员变量age。)

//  3.在该方法里面加限制条件。

1.

class  Ren

{

  private  $age;  //18-50之间。

  function setAge($n)  //通过用这个setAge()方法来可以给$age访问并且赋值。

  {

    if($n>=18 && $n<=50)

    {

      $this->age=$n;

    }

  }

  function  getAge()    //若从外界要调用getAge()就可以获取$age的值了。

  {

    return $this->age;  //返回成员变量age的值

  }

}

$r= new Ren();  //从Ren类里面造一个对象$r

$r->setAge("20");  //给成员变量age赋值20

echo $r->getAge();  //调用getAge方法并且输出age的值

2.

class Ren

{

  private  $age;  //18-50之间

  private  $name;

  //魔术方法,给变量赋值。

  function  __set($n,$v)  //定义一个set方法,参数$n得是一个变量,$v得是一个值。

  {

    if($n=="age")     //加限制,给的$n这个变量如果是$age需要再判断$v是否在18到50之间都满足的话给age赋值,若不满足直接赋值。

    {

      if($v>=18 && $v<=50)

      {

        $this->$n = $v;

      }

    }

    else

    {

      $this->$n = $v;    //给变量$n赋值为$v

    }

  }

}

  //魔术方法,取变量值。

  function  __get($n)  //定义一个__get方法来获取类里面的成员变量。括号内的参数$n为一个变量。

  {

    return  $this->$n;  

  }

$r= new Ren();    //从Ren类里面造一个对象$r

$r->__set("age",20);    //用造的$r这个对象调用类里面的__set方法,再给age这个成员变量赋值20

var_dump($r);        //最后输出一下这个对象$r

echo  $r->$name;      //输出造的对象$r调用一下成员变量name的值,就可以自动直接调用这个__get方法了,它把$name当做参数传到__get方法里面,返回类里面的name值直接使用了

//定义了__set方法的好处:没写__set方法前类里面的成员变量是private的,外界不能访问也就是用以前的$r->age=20;命令按理说不能执行访问并且赋值,但因为在类里面定义了__set方法,所以从外界用以前的$r->age=20命令可以访问并且赋值。

//用__set方法的好处:①通过一个__set方法就可以给类里面多个不同的成员变量赋值或者访问②访问方式跟没用封装之前的访问方式一样没有变。③当别人使用这个类时,还是使用的没有封装前的访问方式进行访问,这样别人就不知道这个类有没有被封装,用来迷惑对方。

//__get和__set方法一般用来在封装里面使用。

原文地址:https://www.cnblogs.com/shandayuan/p/6831514.html