本帖最后由 小鲁哥哥 于 2017-9-5 16:36 编辑
PHP类的重载技术(overloading) (上)
今天为大家带来的是类的重载技术(overloading),大家要好好关注啊,这个可是在框架当中应用非常广泛的哟~
重载的概念 重载不是“重新加载”——跟加载没有关系。 在大多数的面向对象编程语言中: 重载,指的是这样一个现象:在一个类中,有多个同名的方法,他们只是参数不同。 示例代码如下: class A{ function F1($p1){.....} function F1($p2, $p3){ ..... } function F1($s1, $s2, $s3 ){ ..... } } 但: 在php中,一个类中不可以定义同名的方法; 实际上,php中的重载概念,跟其他大多数语言的重载概念,完全不一样! php中,重载,指的是:当对一个对象(或类)使用其不存在(未定义)的属性或方法时,php的一种处理机制!它能够让我们(程序员)预先对这种情况一旦发生,去采取一定的处理措施。 可见,php中的重载,可以分为:属性重载,方法重载 属性重载
分4种情况: __set()魔术方法:
该方法可以定义在一个类中,使这个类的对象,在对其不存在(未定义)的属性进行赋值的时候,会自动调用该方法。 我们可以在该方法中,对这个时候所使用属性名(不存在)和属性值进行某种需要的处理。 形式为: function __set( $name, $value ){ ....这里就是处理代码,其中形参: $name代表该正在使用的不存在的属性名; $value 代表该正在使用要赋的值 } [PHP] 纯文本查看 复制代码 <?php[/align]/*黑马程序员济南中心出品*/
//演示属性重载
class A{
public $p1 = 1;
public $arr = array();//创建一个空数组
function __set($name,$value){
// 实际应用中,其实是"希望"能将这个数据保存起来以供后面使用
$this->arr[$name] = $value;
}
}
$a1 = new A();
$a1->p1 = 11;//使用一个存在的属性,自然没有问题
$a1->p2 = 22;//使用一个不存在的属性
$a1->p3 = 33;//使用一个不存在的属性
var_dump($a1->arr);
输出结果为:
Array([p2]=>22 [p3]=>33)
__get()魔术方法:
当对一个对象的不存在(未定义)的属性,进行取值的时候,会自动调用该方法; 形式: function __get($name){ //形参$name就代表该不存在的属性名,其实只是一个形参变量 ...这里就是我们可以在“这个时候”去做事情的位置, ....通常自然是取出对应的那个不存在的属性的值。 } [PHP] 纯文本查看 复制代码 <?php
/*黑马程序员济南中心出品*/
//演示属性重载
class A{
public $p1 = 1;
public $arr = array();//创建一个空数组
//定义一个类中,使这个类的对象,
//在对其不存在(未定义)的属性进行赋值的时候会自动调用该方法
function __set($name,$value){
// 实际应用中,其实是"希望"能将这个数据保存起来以供后面使用
$this->arr[$name] = $value;
}
//当对一个对象的不存在(未定义)的属性,进行取值的时候,会自动调用该方法
function __get($name){
//判断是否存在数组中
if(isset($this->arr[$name])){
//如果存在数组中,将数组中的信息返回
return $this->arr[$name];
}
}
}
$a1 = new A();
$a1->p1 = 11;//使用一个存在的属性,自然没有问题
$a1->p2 = 22;//使用一个不存在的属性
$a1->p3 = 33;//使用一个不存在的属性
//使用不存在的属性取值
//这个不存在的属性之前赋过值
$v1 = $a1 ->p2 * 3;
echo $v1;
//使用不存在的属性取值
//这个不存在的属性之前没有赋过值
v2 = $a1->p4 * 4;
echo $v2;
[align=left]
__isset()魔术方法:
当对一个对象的不存在(未定义)的属性使用isset()判断的时候,会自动调用该方法; 形式: function __isset( $name ){ ...... } [PHP] 纯文本查看 复制代码 <?php[/align]/*黑马程序员济南中心出品*/
//演示属性重载
class A{
public $p1 = 1;
public $arr = array();//创建一个空数组
//定义一个类中,使这个类的对象,
//在对其不存在(未定义)的属性进行赋值的时候会自动调用该方法
function __set($name,$value){
// 实际应用中,其实是"希望"能将这个数据保存起来以供后面使用
$this->arr[$name] = $value;
}
//当对一个对象的不存在(未定义)的属性,进行取值的时候,会自动调用该方法
function __get($name){
//判断是否存在数组中
if(isset($this->arr[$name])){
//如果存在数组中,将数组中的信息返回
return $this->arr[$name];
}
}
//当对一个对象不存在(未定义)的属性使用isset()判断的时候,会自动调用该方法
function __isset($name){
//判断该数组的该单元是否存在
if(isset($this->arr[$name])){
return true;
}else{
return false;
}
}
}
$a1 = new A();
$a1->p1 = 11;//使用一个存在的属性,自然没有问题
$a1->p2 = 22;//使用一个不存在的属性
$a1->p3 = 33;//使用一个不存在的属性
$b1 = isset($a1->p1);
$b2 = isset($a1->p2);
$b4 = isset($a1->p4);
var_dump($b1,$b2,$b4);
输出结果:
true;
true;
false;
__unset()魔术方法:
当对一个对象的不存在(未定义)的属性使用unset()销毁的时候,会自动调用该方法; 形式: function __unset( $name ){ ...... } [PHP] 纯文本查看 复制代码 <?php[/align]/*黑马程序员济南中心出品*/
//演示属性重载
class A{
public $p1 = 1;
public $arr = array();//创建一个空数组
//定义一个类中,使这个类的对象,
//在对其不存在(未定义)的属性进行赋值的时候会自动调用该方法
function __set($name,$value){
// 实际应用中,其实是"希望"能将这个数据保存起来以供后面使用
$this->arr[$name] = $value;
}
//当对一个对象的不存在(未定义)的属性,进行取值的时候,会自动调用该方法
function __get($name){
//判断是否存在数组中
if(isset($this->arr[$name])){
//如果存在数组中,将数组中的信息返回
return $this->arr[$name];
}
}
//当对一个对象不存在(未定义)的属性使用isset()判断的时候,会自动调用该方法
function __isset($name){
//判断该数组的该单元是否存在
if(isset($this->arr[$name])){
return true;
}else{
return false;
}
}
//当对一个对象的不存在(未定义)的属性使用unset()销毁时,会自动调用该方法
function __unset($name){
unset($this->arr[$name]);
}
}
$a1 = new A();
$a1->p1 = 11;//使用一个存在的属性,自然没有问题
$a1->p2 = 22;//使用一个不存在的属性
$a1->p3 = 33;//使用一个不存在的属性
var_dump($a1->arr);
unset($a1->p3);
var_dump($a1->arr);
执行结果:
array([p2]=>22 [p3]=>33)
array([p2]=>22)
不知道大家对今天讲的类的重载技术之属性重载学习的怎么样啊?有什么疑问欢迎来黑马程序员济南中心来咨询哟~
点进这个帖子的同学肯定是要奋发图强,学技术拿高薪的有志青年,这里我看你骨骼惊奇,是个绝世的练武奇才,你我有缘,今天我就把这个武林秘籍如来神掌传授于你! 什么?不想学如来神掌?不要紧!这里有各个门派的武林绝学,链接拿好!!哈哈哈哈
|