欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

PHP中魔术方法的总结(代码)

程序员文章站 2022-03-18 18:57:27
...
本篇文章给大家带来的内容是关于PHP中魔术方法的总结(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
<?php
/**
 * Created by PhpStorm.
 * User: Itboot
 * Date: 2019/2/13
 * Time: 14:36
 */

/**
 * ----魔术方法类
 * ---php中,程序在特定时间自动调用的方法,叫做魔术方法
 * Class Magic
 */
class Magic
{
    public $name;       //公共的
    protected $age;   //受保护的
    private $height; //私有的

    /**
     *--构造方法
     * -----在内外实例化对象的时候自动调用此方法,一般用来初始化某些变量
     * Magic constructor.
     * @param $name
     * @param $age
     * @param $height
     */
    public function __construct($name, $age, $height)
    {
        $this->name = $name;
        $this->age = $age;
        $this->height = $height;
    }

    /**
     * ---在类外调用受保护的以及私有的成员属性时自动执行该方法
     * ---或者在调用不存在的属性是自动执行该方法
     * @param $name //调用的属性
     */
    public function __get($name)
    {
        echo $name . "该属性你没有权限进行调用或者该属性不存在于" . __CLASS__ . '中--__get()' . PHP_EOL;
    }

    /**
     * ---在类外调用受保护的以及私有的成员属性设置值的时候自动执行此方法
     *----或者类中不存在的属性设置值的时候
     * @param $name //类外调用属性的属性名称
     * @param $value //对属性需要设置的值
     */
    public function __set($name, $value)
    {
        echo $name . "该属性你没有权限进行调用或者该属性不存在于" . __CLASS__ . '中, 不能设为' . $value . '--__set()' . PHP_EOL;
    }

    /**
     *  ---在类外调用一个不存在的普通方法时,调用此方法
     * @param $name //类外调用的方法名称
     * @param array $arguments //调用此方法时传递的参数
     */
    public function __call($name, array $arguments)
    {
        echo $name . "这个普通方法不存在,你调用这个不存在方法传递的值为" . PHP_EOL;
        var_dump($arguments);
    }

    /**
     *---在类外调用一个不存在的静态方法时,调用此方法 ,此方法也必须为静态方法
     * @param $name //类外调用的方法名称
     * @param $arguments //调用此方法时传递的参数
     */
    public static function __callStatic($name, array $arguments)
    {
        echo $name . "这个静态方法不存在,你调用这个不存在方法传递的值为" . PHP_EOL;
        var_dump($arguments);
    }

    /**
     * -----在类外销毁受保护的以及私有的成员属性时调用此魔术方法
     * @param $name // 类外销毁属性的属性名称
     */
    public function __unset($name)
    {
        echo $name . "权限很高,就是不让你销毁啊" . PHP_EOL;
    }

    /**
     * ----在类外判断受保护的以及私有的成员属性是否设置时调用此魔术方法
     * @param $name //  类外判断的属性的属性名称
     */
    public function __isset($name)
    {
        echo $name . "权限很高,就是不让你判断啊" . PHP_EOL;
    }

    /**
     * ------将类实例化为对象之后,使用clone克隆这个类的时候调用此方法,可以在此设置克隆的类的成员属性
     */
    public function __clone()
    {
        $this->name = '小羽';
        $this->age = '18';
        $this->height = '165';
    }


    /**
     * 在类外实例化这个对象之后,序列化这个对象之后调用此方法
     * 作用为只序列化这个方法中返回的成员属性
     */
    public function __sleep()
    {
        return ['age', 'height'];
    }


    /**
     * -----将类实例化为对象的时候,echo或者print 对象调用此方法。!!!注意,此方法内只能return不能echo 或者 print
     * @return string
     */
    public function __toString()
    {
        return "你是不是闲得慌,没事你去输出对象,有病啊" . PHP_EOL;
    }

    /**
     * ---在类外实例化这个对象之后,反序列化的时候调用此方法  可以在反序列化的时候重新初始化成员属性
     */
    public function __wakeup()
    {
        $this->name = '小羽';
        $this->age = '18';
        $this->height = '165';
    }


    /**
     *  ----将类实例化为对象的时候,打印对象时调用此方法, var_dump() 打印此方法返回的数组   5.6之后才有这个魔术方法
     * @return array
     */
    public function __debugInfo()
    {
        return ['age' => 333, 'height' => 3333];
    }

    /**
     * -----__invoke  当把对象当方法调用的时候  首先执行这个魔术方法
     */
    public function __invoke($a)
    {
        echo '__invoke in php...把对象当方法调用了' . $a .PHP_EOL;
    }

    /**
     * --执行完脚本之后会自动调用此方法  析构函数
     */
    public function __destruct() {
        echo 'game over'. PHP_EOL;
    }
}

/**
 * 这是唯一的一个写在类外的魔术方法
 * 在实例化一个不存在的类的时候就会调用此方法
 * 可以用在需要某些类但是没有引入的情况
 */
function __autoload($className) {
    $file = $className .'.php';
    include_once($file);
}

$magic = new Magic('mwh', 22, 170);
$magic('__invoke');
echo $magic;
var_dump($magic);
$new = clone $magic;
print $new->name;

以上就是PHP中魔术方法的总结(代码)的详细内容,更多请关注其它相关文章!

相关标签: PHP