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);

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

 
时间: 2024-07-28 14:04:23

php中常用到的魔术方法的相关文章

java中常用的包、类、以及包中常用的类、方法、属性-----io包

由于最近有需要,所以下面是我整理的在开发中常用的包.类.以及包中常用的类.方法.属性:有需要的看看 java中常用的包.类.以及包中常用的类.方法.属性 常用的包 java.io.*; java.util.*; java.lang.*; java.math.*; java.sql.*; java.text.*; java.awt.*; javax.swing.*;   包名 接口 类 方法 属性 java.io.*; java.io.Serializable实现序列化 java.io.Buffe

Spring中常用的hql查询方法(getHibernateTemplate()) 【转】

一.find(String queryString); 示例:this.getHibernateTemplate().find("from bean.User"); 返回所有User对象 二.find(String queryString , Object value); 示例:this.getHibernateTemplate().find("from bean.User u where u.name=?", "test"); 或模糊查询:th

Android中常用的bitmap处理方法

收集了很多bitmap相关的处理方法,几乎全部应用在项目中,所以特记录下! package com.tmacsky.utils; import java.io.ByteArrayOutputStream; import java.io.IOException; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.gr

【学习ios之路:Objective-C】OC中常用的系统排序方法

①.OC中常用排序方法: 1).不可变数组 - (NSArray *)sortedArrayUsingSelector:(SEL)comparator; - (NSArray *)sortedArrayUsingComparator:(NSComparator)cmptr; 2)可变数组 - (void)sortUsingSelector:(SEL)comparator; - (void)sortUsingComparator:(NSComparator)cmptr; 3).字典排序 - (NS

PHP 中的 9 个魔术方法

这个标题有点牵强因为php有不只9种魔术方法, 但是这些将会引导你使用php魔术方法一个好的开始.它可能魔幻,但是并不需要魔杖. 这些'魔术'方法拥有者特殊的名字,以两个下划线开始,表示这些方法在php特定事件下将会被触发.这可能听起来有点自动魔法但是它真的很酷的,我们已经看过一个简单的例子在 last post,即我们使用一个构造器-使用这个作为我们第一个例子 __construct 构造器是一个魔术方法,当对象被实例化时它会被调用.在一个类声明时它常常是第一件做的事但是没得必要他也像其他任何

PHP中的11个魔术方法总结:__construct,、__destruct、__call等

PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone and __autoload 1.__get.__set这两个方法是为在类和他们的父类中没有声明的属性而设计的__get( $property ) 当调用一个未定义的属性时访问此方法__set( $proper

PHP中的11个魔术方法

1.__get.__set 这两个方法是为在类和他们的父类中没有声明的属性而设计的 __get( $property )       当调用一个未定义的属性时访问此方法__set( $property, $value )    给一个未定义的属性赋值时调用这里的没有声明包括访问控制为proteced,private的属性(即没有权限访问的属性) 2.__isset.__unset __isset( $property ) 当在一个未定义的属性上调用isset()函数时调用此方法__unset(

javascript中常用的事件绑定方法

我们要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有三种常用的绑定事件的方法: 在DOM元素中直接绑定: 在JavaScript代码中绑定: 绑定事件监听函数. 一. 在DOM元素中直接绑定 这里的DOM元素,可以理解为HTML标签.JavaScript支持在标签中直接绑定事件,语法为:    onXXX="JavaScript Code" 其中

线程中常用的几个方法

线程中几个常用的方法interrupt() 中断线程.setDaemon(boolean on) 将该线程标记为守护线程或用户线程.join() -->抢夺CPU执行权 等待该线程终止. join 当A线程执行到B线程的join方法时 A线程就是等待 等B线程都执行完,A线程才会执行 toString() 返回该线程的字符串表示形式,包括线程名称.优先级和线程组. yield() 暂停当前正在执行的线程对象,并执行其他线程.