zoukankan      html  css  js  c++  java
  • php中常用到的魔术方法

    PHP面向对象中有很多功能很强大,不得不说的就是魔术方法了。今天抽出时间记录几个比较常用的魔术方法:

    1.__construct 这是构造函数,指当一个类被实例化的时候就会自动调用的函数。那我们可以在这里初始化变量的值。例如: 

    class Score
    {
        public $chinese;
        public $english;
        public $math;
        public function __construct($chinese=100,$english=99,$math=98)
        {
            $this->chinese=$chinese;
            $this->english=$english;
            $this->math=$math;
        }
        public function show(){
            echo "chinese:{$this->chinese},english:{$this->english},math:{$this->math}";
    
        }

    这个时候,我们可以实例化一个Score对象出来,接着调用Score类的show方法,例如:

    $stu = new Score();
    $stu->show();

    我们实例化一个对象,没有传值,这个时候打印出来就是

    chinese:100,english:99,math:98

    2.__destruct 析构函数。顾名思义,他的作用和构造函数是对立的,当对象被销毁时,析构方法会运行,或者明确的说当我们不再使用它时,php会为我们清理掉。

    public  function __destruct()
        {
            echo "我被摧毁了{$this->math}"; 
    }

    3.__set ()赋值,给属性赋值,接着用另一个魔术方法__get()来取值

    class User
    {
        private $name;
        private $age;
        /*****__set():赋值****/
        function __set($name,$value)
        {
            if($name == "age"){
                if($value <18){
                    $this->age = 18;
                }else{
                    $this->age = $value;
                }
            }else{
                $this->$name = $value;
            }
        }
    }

    4.__get();取值,当__set()方法给某些属性赋值之后,这时候可以用__get()取赋值之后的任意属性,方法如下:

    class User
    {
        private $name;
        private $age;
     
        /****__get():取值***/
        function __get($name)
        {
            if($name == "name"){
                return "dog";
            }else{
                return $this->$name;
            }
        }
    }

    5.__isset();判断是否是这个属性;当当前属性被isset()或者empty(),即当某个属性被检验空的方法调用的时候,会触发这个方法

    class User
    {
        private $name;
        private $age;
        public function __isset($name)
        {
            echo "{$name}isset被调用了";
        }
    }

    调用方法如下:

    $user = new User();
    $user->name = "房明";
    
    isset($user->name);
     

     6.__unset();销毁这某个属性;

    class User
    {
        private $name;
        private $age;
          function __unset($name)
        {
            echo "{$name}被销毁了";
            //防止被销毁的时候直接写一个return即可;
        }
    }

    调用方法如下:

    $user = new User();
    $user->name = "房明";
    
    unset($user->name);

    7.__clone():克隆的时候会调用__clone方法;

    class Four
    {
        public $name;
        public $age;
        public function __construct($name,$age)
        {
            $this->name = $name;
            $this->age = $age;
        }
     
        //克隆的时候会调用__clone方法
        public function __clone()
        {
            $this->age = 0;
        }
    
        }

    调用方法如下:

    $four = new Four("zhq",18);
    $four2 = clone $four; //此时的$four2调用的是__clone方法,所以此时年龄会变为0

    8.__call:当类里面没有方法的时候会调用__call方法;

    class Four
    {
        public $name;
        public $age;
        public function __construct($name,$age)
        {
            $this->name = $name;
            $this->age = $age;
        }
     
        //当类里面没有方法的时候会调用__call方法
        function __call($name, $arguments)
        {
            echo "没有{$name}这个方法,不能这么玩";
        }
    
        }

    调用方法如下:

    $four = new Four("zhq",18);
    $four ->show();//类中没有这个方法,就会调用__call方法

    9.__tostring();当echo的时候会调用__toString方法;

    class Four
    {
        public $name;
        public $age;
        public function __construct($name,$age)
        {
            $this->name = $name;
            $this->age = $age;
        }
        //当echo的时候会调用__toString方法;
          $stu = "chinese:{$this->chinese},english:{$this->english},math:{$this->math}";
            return $stu;
    
        }

    调用方法如下:

    $four = new Four("zhq",18);
    echo $four;echo 实例化出来的时候,就直接调用tostring方法

    10.__autoload:自动加载,当类路径找不到的时候会调用__autoload方法,这个方法很好的解决了需要引用多个include_once的问题;

    class Four
    {
        public $name;
        public $age;
        public function __construct($name,$age)
        {
            $this->name = $name;
            $this->age = $age;
        }
        //当echo的时候会调用__toString方法;
          $stu = "chinese:{$this->chinese},english:{$this->english},math:{$this->math}";
            return $stu;
    
        }

    若在另一个页面调用Four类;不需要再用include_once Four;为了避免代码重复,则有以下方法

    function __autoload($name){
        $path = $name.".class.php";
        include_once $path;
    }//这个时候不需要引入Four类,这就可以直接实例化一个对象

    11.__sleep():当对象被串行化那一瞬间调用这个函数

    class Four
    {
        public $name;
        public $age;
        public function __construct($name,$age)
        {
            $this->name = $name;
            $this->age = $age;
        }
        //当对象被串行化那一瞬间
        function  __sleep()
        {
          // TODO: Implement __sleep() method.
          echo "我要睡着了<br>";
          return array('name','age');
        }
    }

    这个时候我们可以将对象进行串行化的时候,就调用了__sleep()方法;

    $four = new Four("zhq",18);
    //将对象进行串行化
    $four1=serialize($four);
    //将文件写入字符串
    file_put_contents("score.txt",$four1);

    12.__wakeup():将对象进行反串行化的时候调用这个函数

    class Four
    {
        public $name;
        public $age;
        public function __construct($name,$age)
        {
            $this->name = $name;
            $this->age = $age;
        }
         //当对象被反串行化那一瞬间
        public function __wakeup()
        {
            echo "我又回来了<br>";
            // TODO: Implement __wakeup() method.
        }
      
    }

    这个时候我们可以将对象进行反串行化的时候,就调用了__wakeup()方法;

    //读取文件
    $four= file_get_contents("score.txt");
    $obj = unserialize($four);

    目前先记录这些基本的魔术方法,不知道有没有错误,希望大家来指正,虚心学习,积累知识!谢谢,以后还会在增加其他的魔术方法。

     
  • 相关阅读:
    openfiler的介绍与使用
    linux磁盘修复(home或者其他目录无法进入,系统进入emergency mode)
    安装centos系统时出现dracut-initqueue time out 报错
    Linux中sz与rz命令
    /etc/passwd与/etc/shadow
    两台设备做DNS主从同步部署(含正向解析与方向解析)
    通过xftp传输文件失败的解决方法
    /etc/hosts与/etc/resolv.conf区别
    /etc/nsswitch.conf配置文件--服务搜索顺序
    docker学习笔记
  • 原文地址:https://www.cnblogs.com/-zhq/p/6641073.html
Copyright © 2011-2022 走看看