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 相关文章推荐
第四节 构造函数和析构函数 [4]
Oct 09 PHP
php面向对象全攻略 (十四) php5接口技术
Sep 30 PHP
php表单转换textarea换行符的方法
Sep 10 PHP
如何突破PHP程序员的技术瓶颈分析
Jul 17 PHP
输入值/表单提交参数过滤有效防止sql注入的方法
Dec 25 PHP
php隐藏实际地址的文件下载方法
Apr 18 PHP
php实现的一段简单概率相关代码
May 30 PHP
php简单计算年龄的方法(周岁与虚岁)
Dec 06 PHP
tp5(thinkPHP5)操作mongoDB数据库的方法
Jan 20 PHP
PHP多进程通信-消息队列使用
Mar 08 PHP
解决laravel 表单提交-POST 异常的问题
Oct 15 PHP
PHP常用header头定义代码示例汇总
Aug 29 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中遍历stdclass object的实现代码
2011/06/09 PHP
Linux编译升级php的详细方法
2013/11/04 PHP
ThinkPHP之foreach标签使用概述
2014/06/30 PHP
微信公众平台网页授权获取用户基本信息中授权回调域名设置的变动
2014/10/21 PHP
PHP标准库 (SPL)――Countable用法示例
2020/06/05 PHP
JavaScript高级程序设计(第3版)学习笔记12 js正则表达式
2012/10/11 Javascript
Javascript selection的兼容性写法介绍
2013/12/20 Javascript
jQuery中bind(),live(),delegate(),on()绑定事件方法实例详解
2016/01/19 Javascript
javascript每日必学之多态
2016/02/23 Javascript
JavaScript读二进制文件并用ajax传输二进制流的方法
2016/07/18 Javascript
Angular使用ng-messages与PHP进行表单数据验证
2016/12/28 Javascript
JavaScript实现网页头部进度条刷新
2017/04/16 Javascript
Nodejs回调加超时限制两种实现方法
2017/06/09 NodeJs
JS实现数组去重方法总结(六种方法)
2017/07/14 Javascript
js判断节假日实例代码
2017/12/27 Javascript
angularjs $http调用接口的方式详解
2018/08/13 Javascript
微信小程序实现带缩略图轮播效果
2018/11/04 Javascript
vue计算属性computed、事件、监听器watch的使用讲解
2019/01/21 Javascript
Vue.js实现备忘录功能
2019/06/26 Javascript
微信小程序获取位置展示地图并标注信息的实例代码
2019/09/01 Javascript
vue 父组件通过$refs获取子组件的值和方法详解
2019/11/07 Javascript
WINDOWS 同时安装 python2 python3 后 pip 错误的解决方法
2017/03/16 Python
Python中列表与元组的乘法操作示例
2018/02/10 Python
python3爬取各类天气信息
2018/02/24 Python
python 通过xml获取测试节点和属性的实例
2018/03/31 Python
python实现将一个数组逆序输出的方法
2018/06/25 Python
python区块及区块链的开发详解
2019/07/03 Python
python tkinter组件使用详解
2019/09/16 Python
django数据模型(Model)的字段类型解析
2019/12/25 Python
Django高并发负载均衡实现原理详解
2020/04/04 Python
Django与pyecharts结合的实例代码
2020/05/13 Python
keras Lambda自定义层实现数据的切片方式,Lambda传参数
2020/06/11 Python
Flask缓存静态文件的具体方法
2020/08/02 Python
用python对excel进行操作(读,写,修改)
2020/12/25 Python
同学聚会老师邀请函
2014/01/28 职场文书
nginx七层负载均衡配置详解
2022/07/15 Servers