php中的魔术方法(未完成)

9 魔术方法

定义:所谓魔术方法,就是系统在特定时刻自动调用的方法!先写几种常见的魔术方法,其他的以后遇到再加进去

其实我们经常使用的__construct( )和

__destruct()就是魔术方法.

9.1 ___call()函数

我们在调用类中没有的函数时(非静态)时,系统会自动的调用__call()函数格式如下

<?php
class car{
    public function __call($name,$arguments){
        //name是我们所调用却没有定义的函数名称,是以string形式被返回的,而arguments则是以数组形式返回的传入的参数
        var_dump($name);
        print_r($arguments);
    }
}
$a=new car();
$a->b(1,1,2);
?>

输出结果:string(1) "b" Array ( [0] => 1 [1] => 1 [2] => 2 )

9.2 __callStatic()函数

与__call()类似,只不过是适用于调用静态函数时

<?php
class car{
    public static function __callStatic($name,$arguments){
        var_dump($name);
        print_r($arguments);
    }
}
car::b(1,1,2);
?>

输出结果与上面相同

9.3 __get()

__get()函数会在调用类中未声明的成员变量或已经声明的私有的成员变量时自动调用

会自动将未知成员变量以string形式传入__get()

举个例子

<?php
class car{
    public function __get($name){
        var_dump($name);
    }
}
$a=new car();
echo $a->c;
?>

输出结果为:string(1) "c";

9.4 __set()

与其用法与get类似,只不过__set会在给未声明的成员变量或者私有的成员变量赋值时调用

<?php
class car{
    public function __set($property, $value){
        var_dump($property);
        var_dump($value);
    }
}
$a=new car();
$a->c=1;
?>

传入的两个参数一个是成员变量的名称,另一个是所赋的值

输出结果为:string(1) "c" int(1)

9.5 __isset()

了解__isset()函数前我们需要先了解 isser()函数

定义:isset() — 检测变量是否已设置并且非 NULL

检测变量是否设置,并且不是 NULL。

如果已经使用 unset() 释放了一个变量之后,它将不再是 isset()。若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。同时要注意的是 null 字符("")并不等同于 PHP 的 NULL 常量。

如果一次传入多个参数,那么 isset() 只有在全部参数都以被设置时返回 TRUE 计算过程从左至右,中途遇到没有设置的变量时就会立即停止。

isset()的返回值是bool类型的值,当该变量已被声明且非空,返回true反之返回flase

<?php
class car{
    public function __get($name){
    //    var_dump($name);
    }
}
$a=new car();
  var_dump(isset($c));
?>

输出结果:bool(false)

接着我们来看__isset()

与isset()类似,都是来检测变量的函数,不过__isset()是写在类中由系统自动调用的函数

当我们对对象中的变量使用isset()函数时,如果变量是公有的,自然可以正确执行,但假设对象不存在或者为私有的,就会自动执行提前写好的__isset()函数

举个例子:

<?php
class car {
    private $a;
    public function __isset($name)
    {
        var_dump($name);
    }
}
$c=new car();
isset($c->a);
?>

输出结果:string(1) "a";

9.5 __unset();

先说unset()吧

定义:unset() 函数用于销毁给定的变量。

unset()基本上就是释放的变量内存,或者下面程序中会用同名变量

在函数中,unset只能销毁局部变量,并不能销毁全局变量,特别是global引用的变量

如果在函数中 unset() 一个全局变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用

unset() 之前一样的值。

至于__unset()直接类比

__isset()即可除了具体功能不同,其他则相同

原文地址:https://www.cnblogs.com/rpup/p/14402946.html