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 相关文章推荐
几种显示数据的方法的比较
Oct 09 PHP
PHPMailer的主要功能特点和简单使用说明
Feb 17 PHP
纯PHP生成的一个树叶图片画图例子
Apr 16 PHP
浅析PHP程序设计中的MVC编程思想
Jul 28 PHP
PHP实现自动登入google play下载app report的方法
Sep 23 PHP
php专用数组排序类ArraySortUtil用法实例
Apr 03 PHP
PHP中isset与array_key_exists的区别实例分析
Jun 02 PHP
PHP单例模式详细介绍
Jul 01 PHP
php验证手机号码
Nov 11 PHP
php数组分页实现方法
Apr 30 PHP
mac系统下为 php 添加 pcntl 扩展
Aug 28 PHP
PHP实现图片批量打包下载功能
Mar 01 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
IIS环境下快速安装、配置和调试PHP5.2.0
2006/12/17 PHP
thinkPHP中分页用法实例分析
2015/12/26 PHP
php中的抽象方法和抽象类
2017/02/14 PHP
PHP超级全局变量【$GLOBALS,$_SERVER,$_REQUEST等】用法实例分析
2019/12/11 PHP
图片连续滚动代码[兼容IE/firefox]
2009/06/11 Javascript
用JSON做数据传输格式中的一些问题总结
2011/12/21 Javascript
利用谷歌地图API获取点与点的距离的js代码
2012/10/11 Javascript
利用jQuery的deferred对象实现异步按顺序加载JS文件
2013/03/17 Javascript
原生js实现的贪吃蛇网页版游戏完整实例
2015/05/18 Javascript
$.extend 的一个小问题
2015/06/18 Javascript
JS实现状态栏跑马灯文字效果代码
2015/10/24 Javascript
最全面的百度地图JavaScript离线版开发
2016/09/10 Javascript
深究AngularJS中$sce的使用
2017/06/12 Javascript
JS去掉字符串中所有的逗号
2017/10/18 Javascript
AngularJS select加载数据选中默认值的方法
2018/02/28 Javascript
vue-resource请求实现http登录拦截或者路由拦截的方法
2018/07/11 Javascript
前端面试知识点目录一览
2019/04/15 Javascript
Vue实现回到顶部和底部动画效果
2019/07/31 Javascript
使用graphics.py实现2048小游戏
2015/03/10 Python
python图书管理系统
2020/04/05 Python
Python实现正整数分解质因数操作示例
2018/08/01 Python
Flask框架实现的前端RSA加密与后端Python解密功能详解
2019/08/13 Python
python绘制高斯曲线
2021/02/19 Python
用CSS3的box-reflect来制作倒影效果
2016/11/15 HTML / CSS
iHerb香港:维生素、补充剂和天然保健品
2017/08/01 全球购物
职业教育毕业生求职信
2013/11/09 职场文书
安全责任书范文
2014/03/12 职场文书
房屋买卖协议书
2014/04/10 职场文书
贺卡寄语大全
2014/04/11 职场文书
市场营销策划方案
2014/06/11 职场文书
动画设计系毕业生求职信
2014/07/15 职场文书
加强机关作风建设心得体会
2014/10/22 职场文书
2014年电工工作总结
2014/11/20 职场文书
女性健康知识讲座主持词
2015/07/04 职场文书
立秋之描写立秋的作文(五年级)
2019/08/08 职场文书
如何用JavaScipt测网速
2021/05/09 Javascript