PHP魔术方法详解

简介: PHP魔术方法详解

php魔术方法是一些特殊的方法,由特定的环境来进行触发。

这些魔术方法让开发者能够更好地控制对象的行为,特别是在处理不常见的操作或者需要自动化处理某些任务时非常有用。


1、_construct()构造函数:

<?php
highlight_file(__FILE__);
class User {
    public $username;
    public function __construct($username) {
        $this->username = $username;
        echo "触发了构造函数1次" ;
    }
}
$test = new User("benben");
$ser = serialize($test);
unserialize($ser);
?>

_construct()构造函数,在创建实例化对象时自动调用。


2、_destruct()析构函数:

class User {
    public function __destruct()
    {
        echo "触发了析构函数1次"."<br />" ;
    }
}
$test = new User("benben");
$ser = serialize($test);
unserialize($ser);

_destruct()函数,在销毁对象时自动调用。


3、sleep()函数:

class User {
    const SITE = 'uusama';
    public $username;
    public $nickname;
    private $password;
    public function __construct($username, $nickname, $password)    {
        $this->username = $username;
        $this->nickname = $nickname;
        $this->password = $password;
    }
    public function __sleep() {
        return array('username', 'nickname');
    }
}
$user = new User('a', 'b', 'c');
echo serialize($user);

_sleep()函数在对象被序列化时调用。


4、_wakeup()函数:

<?php
highlight_file(__FILE__);
error_reporting(0);
class User {
    const SITE = 'uusama';
    public $username;
    public $nickname;
    private $password;
    private $order;
    public function __wakeup() {
        $this->password = $this->username;
    }
}
$user_ser = 'O:4:"User":2:{s:8:"username";s:1:"a";s:8:"nickname";s:1:"b";}';
var_dump(unserialize($user_ser));
?>

_wakeup()函数在对象被反序列化时调用。


5、_toString()函数:

<?php
highlight_file(__FILE__);
error_reporting(0);
class User {
    var $benben = "this is test!!";
         public function __toString()
         {
             return '格式不对,输出不了!';
          }
}
$test = new User() ;
print_r($test);
echo "<br />";
echo $test;
?>

_toString()函数在将对象转化为字符串时调用。


6、invoke()函数:

<?php
highlight_file(__FILE__);
error_reporting(0);
class User {
    var $benben = "this is test!!";
         public function __invoke()
         {
             echo  '它不是个函数!';
          }
}
$test = new User() ;
echo $test ->benben;
echo "<br />";
echo $test() ->benben;
?>

_invoke()函数在将实例化对象test当作test()函数时调用。


7、_call()函数:

<?php
highlight_file(__FILE__);
error_reporting(0);
class User {
    public function __call($arg1,$arg2)
    {
        echo "$arg1,$arg2[0]";
          }
}
$test = new User() ;
$test -> callxxx('a');
?>

在对象调用一个不存在的·参数和方法时使用。


8、_callStatic()函数:

<?php
highlight_file(__FILE__);
error_reporting(0);
class User {
    public function __callStatic($arg1,$arg2)
    {
        echo "$arg1,$arg2[0]";
          }
}
$test = new User() ;
$test::callxxx('a');
?>

在以静态方式调用一个不可调用的方法时使用。


9、_set()函数:

<?php
highlight_file(__FILE__);
error_reporting(0);
class User {
    public $var1;
    public function __set($arg1 ,$arg2)
    {
        echo  $arg1.','.$arg2;
    }
}
$test = new User() ;
$test ->var2=1;
?>

给类中不存在的成员属性赋值时使用。


10、_get()函数:

<?php
highlight_file(__FILE__);
error_reporting(0);
class User {
    public $var1;
    public function __get($arg1)
    {
        echo  $arg1;
    }
}
$test = new User() ;
$test ->var2;
?>

调用类中不存在的属性时使用。


11、isset()函数:

<?php
highlight_file(__FILE__);
error_reporting(0);
class User {
    private $var;
    public function __isset($arg1 )
    {
        echo  $arg1;
    }
}
$test = new User() ;
isset($test->var);
?>

在使用isset()函数检查类中不可访问的属性是否存在时使用。


12、_unset()函数:

<?php
highlight_file(__FILE__);
error_reporting(0);
class User {
    private $var;
    public function __unset($arg1 )
    {
        echo  $arg1;
    }
}
$test = new User() ;
unset($test->var);
?>

在对不可访问的属性使用unset()时使用。


13、_clone()函数:

<?php
highlight_file(__FILE__);
error_reporting(0);
class User {
    private $var;
    public function __clone( )
    {
        echo  "__clone test";
          }
}
$test = new User() ;
$newclass = clone($test)
?>

使用clone关键字拷贝克隆一个对象后,新对象会自动调用。

相关文章
|
消息中间件 数据安全/隐私保护 Docker
Docker安装rabbitmq
如何使用Docker安装和配置RabbitMQ服务,包括拉取RabbitMQ镜像、创建容器、配置持久化和访问管理界面的步骤。
1158 0
Docker安装rabbitmq
|
搜索推荐 Java UED
SpringBoot 自定义启动画面:打造个性化应用启动体验
【10月更文挑战第7天】在软件开发中,细节往往能够体现一个团队的专业性和对用户体验的关注。SpringBoot作为快速构建Spring应用的框架,其简洁的启动流程和强大的功能深受开发者喜爱。然而,默认的启动画面可能略显单调,无法充分展示应用的特色或品牌。本文将详细介绍如何为SpringBoot应用自定义启动画面,让应用在启动时就能给人留下深刻印象。
335 1
|
弹性计算 人工智能 测试技术
阿里云服务器租用收费标准价格表(2023年更新)
阿里云服务器租用收费标准价格表(2023年更新)
807 0
|
存储 PyTorch 算法框架/工具
Transformers 4.37 中文文档(十九)(4)
Transformers 4.37 中文文档(十九)
579 2
|
监控 Linux 网络安全
Centos7下多种方式配置 Apache虚拟主机
Centos7下多种方式配置 Apache虚拟主机
1346 1
Centos7下多种方式配置 Apache虚拟主机
|
应用服务中间件 Apache PHP
Apache vs Nginx: 实际考虑因素
Apache vs Nginx: 实际考虑因素
360 0
|
C# C++
【Azure Function】在VS Code中创建Function项目遇见 No .NET worker runtimes found
【Azure Function】在VS Code中创建Function项目遇见 No .NET worker runtimes found
|
搜索推荐
EDM营销应该如何制作使用?邮件营销方法
EDM营销通过电子邮件推广产品,关键步骤包括:明确营销目标,如销售额增长或品牌知名度提升;精准定位受众,依据受众特征定制内容;设计吸引人的标题和内容,结合图片或视频;运用个性化信息提升互动性;定期发送保持联系;监测邮件效果如打开率和点击率;并根据分析结果持续优化策略。这些方法能有效提升邮件营销效率和成果。
|
弹性计算
幻兽帕鲁服务器价格多少钱1年?2024年阿里云幻兽帕鲁专用服务器配置价格信息汇总
幻兽帕鲁服务器价格多少钱1年?阿里云幻兽帕鲁服务器价格价格信息来了!今天整理了2024年阿里云幻兽帕鲁专用服务器配置价格信息汇总。
158 0
|
安全 编译器 开发工具
[读书][笔记]WINDOWS PE权威指南《一》PE的原理和基础 之 第一章 环境搭建及简单破解(上)
[读书][笔记]WINDOWS PE权威指南《一》PE的原理和基础 之 第一章 环境搭建及简单破解
238 0