__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
);
}
$class student{
var $school;
var $age;
private $grades;
public function study(){...}
}
在继承的基础上,添加了一些新的方法;
重载:
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,总之子类中的方法总是要高于或等于父类被覆盖方法的访问权限。