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过滤危险html代码
Aug 18 PHP
php获取网页内容方法总结
Dec 04 PHP
PHP IPV6正则表达式验证代码
Feb 16 PHP
深入理解PHP几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
Jun 06 PHP
解析argc argv在php中的应用
Jun 24 PHP
PHP用身份证号获取星座和生肖的方法
Nov 07 PHP
PHP+shell实现多线程的方法
Jul 01 PHP
PHP代码实现爬虫记录――超管用
Jul 31 PHP
深入浅析PHP无限极分类的案例教程
May 09 PHP
原生JS实现Ajax通过POST方式与PHP进行交互的方法示例
May 12 PHP
php中的依赖注入实例详解
Aug 14 PHP
Laravel关系模型指定条件查询方法
Oct 10 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木马攻击防御之道
2008/03/24 PHP
ThinkPHP自动验证失败的解决方法
2011/06/09 PHP
php绘制一个矩形的方法
2015/01/24 PHP
PHP获取当前系统时间的方法小结
2018/10/03 PHP
PHP7 字符串处理机制修改
2021/03/09 PHP
JSDoc 介绍使用规范JsDoc的使用介绍
2011/02/12 Javascript
Javascript根据指定下标或对象删除数组元素
2012/12/21 Javascript
Flex通过JS获取客户端IP和计算机名的实例代码
2013/11/21 Javascript
一个简单的JS时间控件示例代码(JS时分秒时间控件)
2013/11/22 Javascript
原生JavaScript生成GUID的实现示例
2014/09/05 Javascript
jquery append 动态添加的元素事件on 不起作用的解决方案
2015/07/30 Javascript
JS+DIV+CSS实现的经典标签切换效果代码
2015/09/14 Javascript
js前端实现多图图片上传预览的两个方法(推荐)
2016/11/18 Javascript
巧用Javascript的逻辑运算符
2016/12/02 Javascript
jQuery.Form实现Ajax上传文件同时设置headers的方法
2017/06/26 jQuery
实例讲解Vue.js中router传参
2018/04/22 Javascript
Vue.js中使用iView日期选择器并设置开始时间结束时间校验功能
2018/08/12 Javascript
快速了解Node中的Stream流是什么
2019/02/13 Javascript
使用express获取微信小程序二维码小记
2019/05/21 Javascript
微信小程序实现左侧滑栏过程解析
2019/08/26 Javascript
浅谈TypeScript的类型保护机制
2020/02/23 Javascript
Python写的一个简单监控系统
2015/06/19 Python
Python进程间通信之共享内存详解
2017/10/30 Python
python matplotlib坐标轴设置的方法
2017/12/05 Python
Python基于Floyd算法求解最短路径距离问题实例详解
2018/05/16 Python
使用Python读取二进制文件的实例讲解
2018/07/09 Python
python ftplib模块使用代码实例
2019/12/31 Python
Python中全局变量和局部变量的理解与区别
2021/02/07 Python
世界上最大的曲棍球商店:Pro Hockey Life
2017/10/30 全球购物
工程师自我评价怎么写
2013/09/19 职场文书
园林技术个人的自我评价
2014/01/08 职场文书
人力资源求职信
2014/05/25 职场文书
公司任命书范本
2014/06/04 职场文书
NGINX 权限控制文件预览和下载的实现原理
2022/01/18 Servers
「月刊Action」2022年5月号封面公开
2022/03/21 日漫
MySQL的prepare使用以及遇到的bug
2022/05/11 MySQL