美文网首页PHP程序员
PHP面试题:PHP有哪些魔术函数

PHP面试题:PHP有哪些魔术函数

作者: php转go | 来源:发表于2020-09-24 07:25 被阅读0次

PHP魔术函数
一共16个,__autoload()在php7.2之后就被废弃
除了一些老项目,现在一般都不会使用PHP7.2之前的版本了吧,本人公司现在使用的是PHP7.3

魔术函数 说明
__construct() 实例化对象时被调用,当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用。
__destruct() 当删除一个对象或对象操作终止时被调用。
__call() 对象调用某个方法,若方法存在,则直接调用;若不存在,则会去调用__call函数。
__get() 读取一个对象的属性时,若属性存在,则直接返回属性值;若不存在,则会调用__get函数。
__set() 设置一个对象的属性时,若属性存在,则直接赋值;若不存在,则会调用__set函数。
__toString() 打印一个对象的时被调用。如echo obj;或printobj;
__clone() 克隆对象时被调用。如:t=new Test();t1=clone $t;
__sleep() serialize之前被调用。若对象比较大,想删减一点东东再序列化,可考虑一下此函数。
__wakeup() unserialize时被调用,做些对象的初始化工作。
__isset() 检测一个对象的属性是否存在时被调用。如:isset($c->name)。
__unset() unset一个对象的属性时被调用。如:unset($c->name)。
__set_state() 调用var_export时,被调用。用__set_state的返回值做为var_export的返回值。
__autoload() 本特性已自 PHP 7.2.0 起废弃。强烈建议不要使用本特性。 实例化一个对象时,如果对应的类不存在,则该方法被调用。
__callStatic() 对象调用某个静态方法,若方法存在,则直接调用;若不存在,则会去调用__callStatic函数。
__invoke() 当尝试以调用函数的方式调用一个对象时,方法会被自动调用。
__debugInfo() 转储对象以获取应显示的属性时, 此方法由var_dump(调用。如果未在对象上定义该方法,则将显示所有公共,受保护和私有属性

使用实例

class Index
{

    public $sleep;
    private $id;
    private $prop;
    public function __construct($id=null)
    {
        $this->sleep=1;
        $this->prop=$id;
        echo '构造函数';
    }

    public function __destruct()
    {
        echo '析构函数';
    }
    public function __call($name,$data)
    {
        echo $name.'不存在';
    }
    public function __get($name)
    {
        echo $name.'调用了__get';
    }
    public function __set($name,$value)
    {
        echo '对' . $name . "附值" . $value;
    }
    public function __toString()
    {
        return "打印 Test";
    }
    public function __clone()
    {
        echo '克隆对象时被调用';
    }
    public function __sleep()
    {
        return []; #设置序列化时返回的属性
      //  return array('sleep');
    }
    public function __wakeup()
    {
        $this->id=1;#设置反序列化时返回的属性
        echo 'unserialize之前被调用';
    }
    public function __isset($name)
    {
        echo $name.'被判断是否有定义';
    }
    public function __unset($name)
    {
        echo 'unset一个对象的属性时';
    }
    public static  function __set_state($data)
    {
        var_dump($data);
        $obj = new Test();
        $obj->aaa =1;
        $obj->bbb = 2;
        return $obj;
    }
    public static function __callStatic($name,$arguments)
    {
        echo var_dump($name,$arguments);
        // 注意: $name 的值区分大小写
        echo "Calling static method '$name' "
            . implode(', ', $arguments). "\n";
    }
    public function __invoke($x) {
            var_dump($x,'__invoke');
    }
    public function __debugInfo()
    {
        return [
            'propSquared' => $this->prop ** 2,
        ];
    }
}

   $index = new Index();
        echo 1; #直接输出常量,调用了 __construct()与__destruct();
        echo '<hr>';
        $index->aa(); #调用没有定义的方法,调用了 __construct()与__destruct()与__call();
        echo '<hr>';
        echo $index->a; #输出没有定义的属性,调用了 __construct()与__destruct()__get();
        echo '<hr>';
        echo $index->b = 1;#定义属性调,用了 __construct()与__destruct()__set();
        echo '<hr>';
        echo $index; #直接输出对象,调用了 __construct()与__destruct()__toString();
        echo '<hr>';

        //$a=clone $this; #克隆对象,调用了 __construct()与__destruct()__clone();
        echo '<hr>';
        echo $ser = serialize($this);#序列化对象,调用了 __construct()与__destruct()__sleep();
        echo '<hr>';
        var_dump(unserialize($ser));#反序列化对象,调用了 __construct()与__destruct()__wakeup();
        echo '<hr>';
        var_dump(isset($index->e));# 检测一个对象的属性是否存在,调用了 __construct()与__destruct()__isset();
        echo '<hr>';
        unset($index->e);# unset一个对象的属性时,不管这属性存不存在,调用了 __construct()与__destruct()__unset();
        echo '<hr>';
        $index->aaa = 1;
        $index->bbb = 2;
        eval('$b = ' . var_export($index, true) . ';');
        var_dump($b);
        #unset一个对象的属性时,不管这属性存不存在,调用了 __construct()与__destruct()__set_state();

        Index::bbb(123, 123, 456); #调用没有定义的方法,调用了 __construct()与__destruct()与__callStatic();

        $index(5); #以调用函数的方式调用一个对象时,调用了 __construct()与__destruct()与__invoke();

        var_dump(new Index(55)); #调用__debugInfo失败。。。。

相关文章

  • PHP面试题:PHP有哪些魔术函数

    PHP魔术函数一共16个,__autoload()在php7.2之后就被废弃除了一些老项目,现在一般都不会使用PH...

  • 搜藏经典

    PHP 16个魔术方法 PHP 数组函数 PHP 字符串函数 PHP 超全局变量 PHP 面向对象的理解以及三大特...

  • PHP面试题:PHP有哪些魔术常量

    PHP 魔术常量PHP 向它运行的任何脚本提供了大量的预定义常量。 不过很多常量都是由不同的扩展库定义的,只有在加...

  • 链家-开发商端-面试题

    php php常用的数组及用法 php魔术函数 php私有成员变量 列举常用的打印函数及区别 实现一个单例模式 调...

  • PHP面试梳理

    PHP php 魔术方法 、魔术常量 php cli autoload , spl_autoload compos...

  • PHP学习

    PHP内建函数-php真正的威力 php魔术变量PHP 向它运行的任何脚本提供了大量的预定义常量。不过很多常量都是...

  • 19.PHP魔术方法和超全局变量

    PHP魔术方法 1.__autoload () 类文件自动加载函数2.__construct () 构造函数,PH...

  • PHP魔术方法

    PHP魔术方法

  • 如何运用宽字节实现Sql注入?

    什么是魔术引号 了解一个PHP的防御函数==》magic_quotes_gpc(魔术引号开关) magic_quo...

  • PHP参考手册

    PHP参考手册 PHP array() 函数 PHP array_change_key_case()函数 PHP ...

网友评论

    本文标题:PHP面试题:PHP有哪些魔术函数

    本文链接:https://www.haomeiwen.com/subject/frniyktx.html