PHP魔术方法的使用示例


Posted in PHP onJune 23, 2015

① __get/__set:将对象的属性进行接管

当访问一个不存在的对象属性时:

index.php

<?php

define('BASEDIR',__DIR__); //定义根目录常量

include BASEDIR.'/Common/Loader.php';

spl_autoload_register('\\Common\\Loader::autoload');
$obj = new \Common\Object(); 
//在php中访问一个不存在的对象属性时

echo $obj->title;

会抛出一个错误:Notice: Undefined property: Common\Object::$title in D:\practise\php\design\psr0\index.php on line 9

当在Common/Object.php 中添加 __set 和 __get 方法后

Object.php

<?php

namespace Common;
class Object{

    function __set($key,$value){

    }

    

    function __get($key){

    }

}

再执行 index.php,不会再报错。

再次修改 Common/Object.php

<?php

namespace Common;
class Object{

    protected $array = array();

    

    function __set($key,$value){

        var_dump(__METHOD__);

        $this->array[$key] = $value;

    }

    

    function __get($key){

        var_dump(__METHOD__);

        return $this->array[$key];

    }

}

index.php
<?php

define('BASEDIR',__DIR__); //定义根目录常量

include BASEDIR.'/Common/Loader.php';

spl_autoload_register('\\Common\\Loader::autoload');
$obj = new \Common\Object(); 
$obj->title = 'hello';

echo $obj->title;

执行 index.php,页面输出:

string 'Common\Object::__set' (length=20)

string 'Common\Object::__get' (length=20)

hello

② __call/__callStatic:控制 PHP 对象方法的调用(__callStatic 用来控制类的静态方法)

当执行一个不存在的php方法时

index.php:

<?php

define('BASEDIR',__DIR__); //定义根目录常量

include BASEDIR.'/Common/Loader.php';

spl_autoload_register('\\Common\\Loader::autoload');
$obj = new \Common\Object(); 
//当执行一个不存在的php方法时

$obj->test('hello',123);

执行 index.php 会报一个致命错误:Fatal error: Call to undefined method Common\Object::test() in D:\practise\php\design\psr0\index.php on line 9

如果在 Common/Object 中定义一个__call 方法,则会在方法不存在时自动回调:

<?php

namespace Common;
class Object{    

    function __call($func, $param){ //$func 方法名 $param 参数

        var_dump($func, $param);

        return "magic function\n"; //返回一个字符串作为返回值

    }

}

index.php

<?php

define('BASEDIR',__DIR__); //定义根目录常量

include BASEDIR.'/Common/Loader.php';

spl_autoload_register('\\Common\\Loader::autoload');
$obj = new \Common\Object(); 
//当执行一个不存在的php方法时

echo $obj->test('hello',123);

页面输出:

string 'test' (length=4)

array

  0 => string 'hello' (length=5)

  1 => int 123

magic function

当调用一个不存在的静态方法时

Common/Object.php

<?php

namespace Common;
class Object{

    static function __callStatic($name, $arguments) {

        var_dump($name, $arguments);

        return "magic function\n"; //返回一个字符串作为返回值        

    }

}

注意:__callStatic 方法也要声明成静态方法

index.php

<?php

define('BASEDIR',__DIR__); //定义根目录常量

include BASEDIR.'/Common/Loader.php';

spl_autoload_register('\\Common\\Loader::autoload');
//执行一个不存在的静态方法

echo Common\Object::test("hello",1234);

执行 index.php ,页面输出:

string 'test' (length=4)

array

  0 => string 'hello' (length=5)

  1 => int 1234

magic function

③ __toString:将一个 PHP 对象转换成一个字符串

index.php

<?php

define('BASEDIR',__DIR__); //定义根目录常量

include BASEDIR.'/Common/Loader.php';

spl_autoload_register('\\Common\\Loader::autoload');
$obj = new \Common\Object();
echo $obj;

此时会报错: Catchable fatal error: Object of class Common\Object could not be converted to string in D:\practise\php\design\psr0\index.php on line 8

在 Object.php 中添加 __toString 方法

<?php

namespace Common;
class Object{

    function __toString() {

        return __CLASS__;

    }

}

④ __invoke:将一个 PHP 对象当成一个函数来执行时,会回调此魔术方法

index.php

<?php

define('BASEDIR',__DIR__); //定义根目录常量

include BASEDIR.'/Common/Loader.php';

spl_autoload_register('\\Common\\Loader::autoload');
$obj = new \Common\Object();
echo $obj("test");

Object.php
<?php

namespace Common;
class Object{

    function __invoke($param) {

        var_dump($param);

        return 'invoke';

    }

}

页面输出:

string 'test' (length=4)

invoke
PHP 相关文章推荐
实用函数8
Nov 08 PHP
PHP提取数据库内容中的图片地址并循环输出
Mar 21 PHP
php使用指定字符列表生成随机字符串的方法
Apr 18 PHP
php检查字符串中是否有外链的方法
Jul 29 PHP
PHP文件上传操作实例详解
Sep 27 PHP
关于PHP中字符串与多进制转换函数的实例代码
Nov 03 PHP
Yii2中datetime类的使用
Dec 17 PHP
详解Yii2 定制表单输入字段的标签和样式
Jan 04 PHP
PHP+AJAX 投票器功能
Nov 11 PHP
PHP中单例模式的使用场景与使用方法讲解
Mar 18 PHP
PHP7新增函数
Mar 09 PHP
PHP中国际化的字符串排序和比较对象详解
Aug 23 PHP
8个PHP数组面试题
Jun 23 #PHP
php中 ob_start等函数截取标准输出的方法
Jun 22 #PHP
php发送邮件的问题详解
Jun 22 #PHP
PHP获取音频文件的相关信息
Jun 22 #PHP
php生成PDF格式文件并且加密
Jun 22 #PHP
用PHP生成excel文件到指定目录
Jun 22 #PHP
php通过baihui网API实现读取word文档并展示
Jun 22 #PHP
You might like
我常用的几个类
2006/10/09 PHP
php 带逗号千位符数字的处理方法
2012/01/10 PHP
php array的学习笔记
2012/05/10 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
2014/11/04 PHP
PHP实现连接设备、通讯和发送命令的方法
2015/10/13 PHP
详解EventDispatcher事件分发组件
2016/12/25 PHP
总结一些PHP中好用但又容易忽略的小知识
2017/06/02 PHP
PHP实现的简单组词算法示例
2018/04/10 PHP
JS去除字符串的空格增强版(可以去除中间的空格)
2009/08/26 Javascript
js 字符串转换成数字的三种方法
2013/03/23 Javascript
Js判断参数(String,Array,Object)是否为undefined或者值为空
2013/11/04 Javascript
JavaScript DOM元素尺寸和位置
2015/04/13 Javascript
纯javascript制作日历控件
2015/07/17 Javascript
Vue.js实现一个漂亮、灵活、可复用的提示组件示例
2017/03/17 Javascript
浅谈Angular4实现热加载开发旅程
2017/09/08 Javascript
Mint UI 基于 Vue.js 移动端组件库
2017/11/07 Javascript
JavaScript门道之标准库
2018/05/26 Javascript
从表单校验看JavaScript策略模式的使用详解
2020/10/17 Javascript
vue 项目@change多个参数传值多个事件的操作
2021/01/29 Vue.js
[05:16]《大圣!大圣》——DOTA2新英雄齐天大圣配音李世宏老师专访
2016/12/13 DOTA
python实现文件名批量替换和内容替换
2014/03/20 Python
python编写网页爬虫脚本并实现APScheduler调度
2014/07/28 Python
python 读取目录下csv文件并绘制曲线v111的方法
2018/07/06 Python
在双python下设置python3为默认的方法
2018/10/31 Python
Python判断字符串是否为空和null方法实例
2020/04/26 Python
css3 给背景设置渐变色的方法
2019/09/12 HTML / CSS
美赞臣营养马来西亚旗舰店:Enfagrow马来西亚
2019/07/26 全球购物
如何执行一个shell程序
2012/11/23 面试题
人事行政主管岗位职责
2013/12/22 职场文书
《湘夫人》教学反思
2014/02/21 职场文书
大学班级文化建设方案
2014/05/06 职场文书
大学第二课堂活动总结
2014/07/08 职场文书
卫生院艾滋病宣传活动小结
2014/07/09 职场文书
升学宴演讲稿
2014/09/01 职场文书
2014年公务员退休工资改革方案
2014/10/01 职场文书
2014年学校总务处工作总结
2014/12/08 职场文书