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中利用XML技术构造远程服务(上)
Oct 09 PHP
使用php来实现网络服务
Sep 15 PHP
解析Win7 XAMPP apache无法启动的问题
Jun 26 PHP
PHP分页效率终结版(推荐)
Jul 01 PHP
ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法
Aug 08 PHP
php之readdir函数用法实例
Nov 13 PHP
php使用数组填充下拉列表框的方法
Mar 31 PHP
JavaScript实现删除电脑的关机键
Jul 26 PHP
php版微信支付api.mch.weixin.qq.com域名解析慢原因与解决方法
Oct 12 PHP
PHP设计模式之工厂方法设计模式实例分析
Apr 25 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
Oct 18 PHP
laravel ajax curd 搜索登录判断功能的实现
Apr 17 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/12/03 PHP
修改PHP的memory_limit限制的方法分享
2012/02/21 PHP
PHP获取网页标题的3种实现方法代码实例
2014/04/11 PHP
Laravel 5 框架入门(四)完结篇
2015/04/09 PHP
php倒计时出现-0情况的解决方法
2016/07/28 PHP
PHP Cookie学习笔记
2016/08/23 PHP
简单实现php上传文件功能
2017/09/21 PHP
基于jsTree的无限级树JSON数据的转换代码
2010/07/27 Javascript
图片上传判断及预览脚本的效果实例
2013/08/07 Javascript
Javascript连接多个数组不用concat来解决
2014/03/24 Javascript
谷歌地图打不开的解决办法
2014/08/07 Javascript
nodejs中简单实现Javascript Promise机制的实例
2014/12/06 NodeJs
JavaScript事件类型中焦点、鼠标和滚轮事件详解
2016/01/25 Javascript
seajs学习之模块的依赖加载及模块API的导出
2016/10/20 Javascript
Bootstrap提示框效果的实例代码
2017/07/12 Javascript
jQuery实现的简单动态添加、删除表格功能示例
2017/09/21 jQuery
React Router v4 入坑指南(小结)
2018/04/08 Javascript
详解vue通过NGINX部署在子目录或者二级目录实践
2018/09/03 Javascript
浅谈vuex为什么不建议在action中修改state
2020/02/02 Javascript
vue实现商品列表的添加删除实例讲解
2020/05/14 Javascript
举例讲解Python中的算数运算符的用法
2015/05/13 Python
Python 类与元类的深度挖掘 II【经验】
2016/05/06 Python
Python中标准模块importlib详解
2017/04/16 Python
Python实现接受任意个数参数的函数方法
2018/04/21 Python
详解python路径拼接os.path.join()函数的用法
2019/10/09 Python
python由已知数组快速生成新数组的方法
2020/04/08 Python
canvas因为图片资源不在同一域名下而导致的跨域污染画布的解决办法
2019/01/18 HTML / CSS
固特异美国在线轮胎店:Goodyear Tire
2019/02/23 全球购物
Woods官网:加拿大最古老、最受尊敬的户外品牌之一
2020/09/12 全球购物
安全事故检讨书
2014/01/18 职场文书
工厂门卫岗位职责范本
2014/04/04 职场文书
竞争上岗演讲稿范文
2014/05/12 职场文书
年度安全生产目标责任书
2014/07/23 职场文书
关于企业的执行力标语大全
2020/01/06 职场文书
Pytorch 统计模型参数量的操作 param.numel()
2021/05/13 Python
Windows Server 2012 R2 磁盘分区教程
2022/04/29 Servers