php中常用到的魔术方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);

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

 

 




以上是关于php中常用到的魔术方法的主要内容,如果未能解决你的问题,请参考以下文章

PHP链式操作通过call和callstatic魔术方法的实现,以及phpstorm通过注释去追踪function

PHP中常用的魔术方法

swift常用代码片段

php学习九:存取器&魔术方法

PHP中的常见魔术方法功能作用及用法实例

巧用PHP中__get()魔术方法