不论你是什么样的程序员,或者运用什么语言进行编程,相信大家一定对重载一定不会陌生的,但是作为php的重载,却与众不同,因为是php这门语言(暂时理解为语言,脚本我不太喜欢)决定了它的风格,也许你是一个java程序员,那么你对重载一定会说的很彻底,但是php的重载却不是那样的,那么我们对比下java中的重载和php中的重载的定义:
1.java中的重载定义和php中的重载定义(白话文)
java重载:就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。
php中重载:重新载入不可访问的成员的处理,称之为成员的重载(一般包括属性重载和方法重载);继续往下看....
2,代码对比
java:
public function a($a){}
public function a($a,$b){}//参数不同区分同名方法
php:
public function a($a){}//这个正确的
public function a($a,$b){}//不正确的定义
3.php中的属性重载
默认的,php是支持将属性重新加载的对象内部的!这种显现就称之为属性的重载!php对访问不可访问属性这种操作可以使用相应的处理方式进行处理!
利用php所提供的魔术方法来完成!
一共四个方法,分别处理属性操作的4个情况!
属性指的是不可访问的属性:一种不存在的属性,另一种通过访问修饰控制访问不到的
__set(),属性赋值。当赋值情况发生时,会自动执行到__set()方法,通过set方法内的代码,来决定如何处理该属性。得到两个参数,属性名和属性值!
__get(),读取属性值。当对不可访问属性获取值时,会自动调用该方法,该方法,获得当前的属性名加以操作!
__unset,删除属性。当删除私有属性时候自动调用该方法,根据内部实现unset()删除属性操作
__isset()判断当前的属性值。
class Student {
private $stu_id = ‘2014‘;//需要被读取
private $name = ‘php‘;//被读取
private $money = 0.0;//读取和设置
private $team_id = ‘2003‘;//读取和设置
//操作接口
// public function getId() {}
// public function getName() {}
// public function getMoney() {}
// public function getTeam() {}
//
// public function setMoney() {}
// public function setTeam() {}
/**
* 在为一个不可访问属性赋值时,会自动触发
* @param $property_name string 属性名
* @param $property_value mixed 属性值
*/
public function __set($property_name, $property_value) {
$allow_write = array(‘money‘, ‘team_id‘);
if(in_array($property_name, $allow_write)) {
//当前属性可读
$this->$property_name = $property_value;
}
}
public function __get($property_name) {
$allow_read = array(‘stu_id‘, ‘name‘, ‘money‘, ‘team_id‘);//所有可读的属性
if(in_array($property_name, $allow_read)) {
//当前属性可读
return $this->$property_name;
}
}
}
$stu = new Student;
echo $stu->stu_abcd;
echo ‘<hr>‘;
$stu->money = 3600.0;
echo $stu->money;
echo ‘<hr>‘;
$stu->name = ‘net‘;
echo $stu->name;
echo ‘<hr>‘;
$stu->new_p = ‘hao123‘;
echo $stu->new_p;
var_dump($stu);
***********************************************************************__unset和__isset******************************************************************************
class Student {
private $stu_id = ‘2014‘;//需要被读取
private $name = ‘php‘;//被读取
private $money = 0.0;//读取和设置
private $team_id = ‘2003‘;//读取和设置
public function __unset($p_name) {
//该属性可删除,在内部执行unset方法
if($p_name == ‘team_id‘) {
unset($this->$p_name);
}
}
public function __isset($p_name) {
if($p_name == ‘name‘ || $p_name == ‘team_id‘) {
return true;
} else {
return false;
}
}
}
$o = new Student;
var_dump(isset($o->stu_id));
var_dump(isset($o->name));
exit;
unset($o->stu_id);
unset($o->team_id);
var_dump($o);
总结:以上基本就是重载中的属性重载的基本用法,那么下一章节,有方法重载......
原文地址:http://blog.csdn.net/benshuhuai/article/details/40025283