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 相关文章推荐
第十一节 重载 [11]
Oct 09 PHP
PHP的FTP学习(二)
Oct 09 PHP
apache2.2.4+mysql5.0.77+php5.2.8安装精简
Apr 29 PHP
zf框架的session会话周期及次数限制使用示例
Mar 13 PHP
php之curl设置超时实例
Nov 03 PHP
php生成PDF格式文件并且加密
Jun 22 PHP
php实现遍历多维数组的方法
Nov 25 PHP
PHP的数组中提高元素查找与元素去重的效率的技巧解析
Mar 03 PHP
PHP 无限级分类
May 04 PHP
实例讲解YII2中多表关联的使用方法
Jul 21 PHP
PHP实现mysqli批量执行多条语句的方法示例
Jul 22 PHP
Laravel框架实现即点即改功能的方法分析
Oct 31 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下操作Linux消息队列完成进程间通信的方法
2010/07/24 PHP
深入解析phpCB批量转换的代码示例
2013/06/27 PHP
php usort 使用用户自定义的比较函数对二维数组中的值进行排序
2017/05/02 PHP
Jquery 例外被抛出且未被接住原因介绍
2013/09/04 Javascript
JavaScript汉诺塔问题解决方法
2015/04/21 Javascript
JavaScript动态添加style节点的方法
2015/06/09 Javascript
使用jQuery Mobile框架开发移动端Web App的入门教程
2016/05/17 Javascript
辨析JavaScript中的Undefined类型与null类型
2016/05/26 Javascript
JavaScript的this关键字的理解
2016/06/18 Javascript
BootStrap tab选项卡使用小结
2020/08/09 Javascript
bootstrap基础知识学习笔记
2016/11/02 Javascript
js实现九宫格拼图小游戏
2017/02/13 Javascript
设置cookie指定时间失效(实例代码)
2017/05/28 Javascript
微信小程序 转发功能的实现
2017/08/04 Javascript
JS使用iView的Dropdown实现一个右键菜单
2019/05/06 Javascript
深入了解JavaScript 防抖和节流
2019/09/12 Javascript
Element-Ui组件 NavMenu 导航菜单的具体使用
2019/10/24 Javascript
python记录程序运行时间的三种方法
2017/07/14 Python
Python编程使用NLTK进行自然语言处理详解
2017/11/16 Python
DataFrame中的object转换成float的方法
2018/04/10 Python
详解pandas中MultiIndex和对象实际索引不一致问题
2019/07/23 Python
Python 爬虫实现增加播客访问量的方法实现
2019/10/31 Python
Python pickle模块实现对象序列化
2019/11/22 Python
Python MySQLdb 执行sql语句时的参数传递方式
2020/03/04 Python
spyder 在控制台(console)执行python文件,debug python程序方式
2020/04/20 Python
浅谈Python程序的错误:变量未定义
2020/06/02 Python
实现Python3数组旋转的3种算法实例
2020/09/16 Python
html5的canvas元素使用方法介绍(画矩形、画折线、圆形)
2014/04/14 HTML / CSS
德国宠物用品、宠物食品及水族馆网上商店:ZooRoyal
2017/07/09 全球购物
Lampenwelt德国:欧洲领先的灯具和照明在线商店
2018/08/05 全球购物
铭宣海淘转运:美国、日本、英国转运等全球转运公司
2019/09/10 全球购物
mysql有关权限的表都有哪几个
2015/04/22 面试题
介绍下static、final、abstract区别
2015/01/30 面试题
中层干部岗位职责
2013/12/18 职场文书
创业计划书之服装
2019/10/07 职场文书
浅析Python中的套接字编程
2021/06/22 Python