php 魔术方法详解


Posted in PHP onNovember 11, 2014

从PHP 5以后的版本,PHP中的类就可以使用魔术方法了。其规定以两个下划线(__)开头的方法都保留为魔术方法,所以建议大家函数名最好不用__开头,除非是为了重载已有的魔术方法。PHP 将所有以 _ _(两个下划线)开头的类方法保留为魔术方法。

__toString() 和__invoke()

public string __toString ( void ):当对象被当做string使用时,这个方法会被自动调用。此方法必须返回一个字符串

<?php

    class Magic{

        public function  __tostring(){

            return "hello world!";

        }

    }

    $obj = new Magic();

    echo $obj;//hello world!

?>

__invoke():当对象被当成方法调用时,这个方法会被自动调用。

<?php

    class Magic{

        public function  __tostring(){

            return "hello world!";

        }

        public function __invoke($x){

            echo "__invoke called with param ".$x."\n";

        }

    }

    $obj = new Magic();

    $obj(10);//__invoke called with param 10 

?>

__call()和__callStatic()

__call():当对象访问不存在的方法名称时,__call()方法会被自动调用

__callStatic():当对象访问不存在的静态方法名称时,__callStatic()方法会被自动调用

通过这两个方法,同一个方法的名称的调用可以对应不同的方法实现

<?php

class Magic{

   //`$name` 参数是要调用的方法名称。`$arguments` 参数是一个枚举数组,

  //包含着要传递给方法 `$name` 的参数。

        public function __call($name,$arguments){

            //implode() 函数把数组元素组合为一个字符串。implode(separator,array)

            echo "Calling " . $name ." with param: ".implode(", ",$arguments)."\n";

        }

    }

$obj = new Magic();

$obj->run("para1","para2");//obj去调用run方法,输出:Calling run with param: para1, para2   

?>

__get()和__set()

在给不可访问属性赋值时,__set()会被调用
读取不可访问属性的值时,__get()会被调用

<?php

class Magic{

     //function 前要有static关键字

    public function __get($name){

        return "Getting the property " . $name;

    }

}

$obj = new Magic();

echo $obj->className."\n";//Getting the property className 

?>

读取不可访问属性的值时,__get()会被调用

<?php

class Magic{
    public function __set($name,$value){

        echo "Setting the property " . $name ."to value ". $value ."\n";

    }

}

$obj = new Magic();

$obj->className = 'MagicClass';//Setting the property classNameto value MagicClass 

?>

__isset()和__unset()

当对不可访问属性调用isset()或empty()时,__isset()会被调用
当对不可访问属性调用unset()时,__unset()会被调用

<?php

class Magic{

    public function __isset($name){

        echo "__isset invoked\n";

        return true;

    }

}

$obj = new Magic();

echo '$obj->className is set?'.isset($obj->className)."\n";//__isset invoked     $obj->className is set?1 

?>

以上便是8个php面向对象的魔术方法的介绍与示例,希望对大家能有所帮助

PHP 相关文章推荐
PHP中Session的概念
Oct 09 PHP
针对初学PHP者的疑难问答(1)
Oct 09 PHP
PHP新手上路(七)
Oct 09 PHP
一个可以找出源代码中所有中文的工具
Oct 25 PHP
PHP 多维数组排序(usort,uasort)
Jun 30 PHP
PHP autoload与spl_autoload自动加载机制的深入理解
Jun 05 PHP
基于PHP技术开发客服工单系统
Jan 06 PHP
非常经典的PHP文件上传类分享
May 15 PHP
php 判断字符串编码是utf-8 或gb2312实例
Nov 01 PHP
php计算多个集合的笛卡尔积实例详解
Feb 16 PHP
PHP性能分析工具xhprof的安装使用与注意事项
Dec 19 PHP
php抽象方法和普通方法的区别点总结
Oct 13 PHP
php多个文件及图片上传实例详解
Nov 10 #PHP
PHP文件上传判断file是否己选择上传文件的方法
Nov 10 #PHP
php数组操作之键名比较与差集、交集赋值的方法
Nov 10 #PHP
php json转换成数组形式代码分享
Nov 10 #PHP
PHP冒泡算法详解(递归实现)
Nov 10 #PHP
PHP字符串word末字符实现大小写互换的方法
Nov 10 #PHP
PHP 快速排序算法详解
Nov 10 #PHP
You might like
php 获得汉字拼音首字母的函数
2009/08/01 PHP
PHP数据类型之整数类型、浮点数的介绍
2013/04/28 PHP
PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式
2014/05/04 PHP
PHP5.4起内置web服务器使用方法
2016/08/09 PHP
PHP利用curl发送HTTP请求的实例代码
2020/07/09 PHP
js模拟实现Array的sort方法
2007/12/11 Javascript
jquery tools 系列 scrollable(2)
2009/09/06 Javascript
基于JQuery的一个简单的鼠标跟随提示效果
2010/09/23 Javascript
js实现图片轮换效果代码
2013/04/16 Javascript
Javascript实现简单的富文本编辑器附演示
2014/06/16 Javascript
网页下载文件期间如何防止用户对网页进行其他操作
2014/06/27 Javascript
使用jquery清空、复位整个输入域
2015/04/02 Javascript
jquery获取当前元素索引值用法实例
2015/06/10 Javascript
javascript中错误使用var造成undefined
2016/03/31 Javascript
浅谈js中几种实用的跨域方法原理详解
2016/12/02 Javascript
详解Angular2中Input和Output用法及示例
2017/05/21 Javascript
小程序使用watch监听数据变化的方法详解
2019/09/20 Javascript
解决layui laydate 时间控件一闪而过的问题
2019/09/28 Javascript
[56:12]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第一场 6.3
2018/06/04 DOTA
python字符串替换示例
2014/04/24 Python
python最长回文串算法
2018/06/04 Python
Python并发之多进程的方法实例代码
2018/08/15 Python
Python定义函数功能与用法实例详解
2019/04/08 Python
Python静态类型检查新工具之pyright 使用指南
2019/04/26 Python
Python 实现OpenCV格式和PIL.Image格式互转
2020/01/09 Python
tensorflow实现二维平面模拟三维数据教程
2020/02/11 Python
python数据预处理 :样本分布不均的解决(过采样和欠采样)
2020/02/29 Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
2020/04/22 Python
python3中calendar返回某一时间点实例讲解
2020/11/18 Python
Python+MySQL随机试卷及答案生成程序的示例代码
2021/02/01 Python
CSS3实现翘边的阴影效果的代码示例
2016/06/13 HTML / CSS
Luxplus瑞典:香水和美容护理折扣
2018/01/28 全球购物
HR喜欢的自荐信格式
2013/10/08 职场文书
《走一步再走一步》教学反思
2014/02/15 职场文书
Java 关于String字符串原理上的问题
2022/04/07 Java/Android
如何Python使用re模块实现okenizer
2022/04/30 Python