10分钟学会php面相对象基础(Ⅱ)

__set(),__get(),__isset(),__unset()四个方法的应用

预定义了两个函数”__get()”和”__set()”来获取和赋值其属性,以及检查属性的”__isset()”和删除属性的方法”__unset()”;

不过,get和set都需要想 construct、destruct一样,手动加入到方法中,才能使用;

如 function __get($name){

if(isset($this->name)){

return $this->name;

}else{

return null;

}

}

function __set($name,$value){

$this->name = $value;

}

此后,就可以在对象以外,直接赋值和取值;

如  echo $a->name; 这实际上就是在使用get;

 

“unset()”这个函数的作用是删除指定的变量且传回true,参数为要删除的变量;

"isset()"是测定变量是否设定用的函数,传入一个变量作为参数,如果传入的变量存在则传回true,否则传回false。

一旦在类内部描述了
private function __isset[__unset]($nm)
{
    echo "当在类外部使用isset()函数测定私有成员$nm时,自动调用<br />";
 
    return isset($this->$nm);
}
就可以在类以外,判断属性有没有被定义 isset($run);
 
前面讲了OOP三特性之一 封装
 
现在说三大特效之二 继承
集成简单来讲,就是预先定义了一个类,叫衬衫,可能包含了 布料、肩宽、大身长等几个属性,清洗、穿等几个方法;然后有一个新的类, 叫时装衬衫,可能会多几个类,如辅料、印花等。我们可以看到,在衬衫的基础上,扩展出了时装衬衫,通过继承机制,可以利用已有的数据类型来定义新的数据类型。
C++中提供多继承,但java和php中提供单集成,即一个子类只能继承一个父类;
 

$class student{

var $school;

var $age;

private $grades;

public function study(){...}

} 

 这是一个学生类,现在根据小中高大等,我们派生出更多类;
$class highSchool extend student{
  public function FallInLove($girl){
  ...
  }
}

在继承的基础上,添加了一些新的方法;

重载:

PHP里面没有方法重载 ,不能重载也就是在你的项目中不能定义相同方法名的方法。

那么在php里的重载怎么进行,可以通过继承之后,重新定义方法。目的是,比如上没提到的衬衫,可能一个方法输出袖子的长度和几个纽扣。但是子类中,可能有新的属性需要通过类似的方式来输出。

 

但这时候是简单的情景,如果父类中的方法你并不可见,或者可见,但是几百行代码,怎么办。

这是有就可以使用 parent:: 用法如下

例如父类中是这样的

$class student{

  var $school;

  public function __construct($school){

    $this->school = $school;

  }

  private function study(){

    echo $school;

  }

}

子类,新增了谈恋爱方法、女朋友属性

$class highSchoolStudent extend student(){

  var $girlFriend;

  public function __construct($school,$grilFriend){

    parent::__construct($school);

    $this->girlFriend = $girlFriend;

  }

  private function study(){

    parent::study();

    //add sth.

    echo $girlFriend;

  }

}

前面已经用到了很多次访问类型,具体为public (公有的、默认的),protected (受保护的)和private (私有的)三种。

  private protected public
同一个类里 V V V
子类里 X V V
所有外部成员 X X V

在子类覆盖父类的方法时也要注意一点,子类中方法的访问权限一定不能低于父类被覆盖方法的访问权限,也就是一定要高于或等于父类方法的访问权限。

例如,如果父类方法的访问权限是protected,那么子类中要覆盖的权限就要是protected和public,如果父类的方法是public那么子类中要覆盖的方法只能也是public,总之子类中的方法总是要高于或等于父类被覆盖方法的访问权限。

原文地址:https://www.cnblogs.com/07byte/p/5823841.html