A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小鲁哥哥 于 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)

不知道大家对今天讲的类的重载技术之属性重载学习的怎么样啊?有什么疑问欢迎来黑马程序员济南中心来咨询哟~
点进这个帖子的同学肯定是要奋发图强,学技术拿高薪的有志青年,这里我看你骨骼惊奇,是个绝世的练武奇才,你我有缘,今天我就把这个武林秘籍如来神掌传授于你! 什么?不想学如来神掌?不要紧!这里有各个门派的武林绝学,链接拿好!!哈哈哈哈



1 个回复

倒序浏览
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马