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 相关文章推荐
一个程序下载的管理程序(四)
Oct 09 PHP
基于mysql的bbs设计(三)
Oct 09 PHP
PR值查询 | PageRank 查询
Dec 20 PHP
PHP has encountered an Access Violation
Jan 15 PHP
php生成zip压缩文件的方法详解
Jun 09 PHP
PHP函数strip_tags的一个bug浅析
May 22 PHP
php查看当前Session的ID实例
Mar 16 PHP
typecho插件编写教程(一):Hello World
May 28 PHP
PHP生成plist数据的方法
Jun 16 PHP
DWZ+ThinkPHP开发时遇到的问题分析
Dec 12 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
Jul 22 PHP
PHP PDOStatement::closeCursor讲解
Jan 30 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
模拟xcopy的函数
2006/10/09 PHP
深入了解php4(2)--重访过去
2006/10/09 PHP
PHP中遍历stdclass object的实现代码
2011/06/09 PHP
php数据结构 算法(PHP描述) 简单选择排序 simple selection sort
2011/08/09 PHP
php 中序列化和json使用介绍
2013/07/08 Javascript
js从10种颜色中随机取色实现每次取出不同的颜色
2013/10/23 Javascript
用iframe实现不刷新整个页面上传图片的实例
2016/11/18 Javascript
String字符串截取的四种方式总结
2016/11/28 Javascript
Vue.js实现实例搜索应用功能详细代码
2017/08/24 Javascript
vue 中引用gojs绘制E-R图的方法示例
2018/08/24 Javascript
详解JavaScript事件循环机制
2018/09/07 Javascript
实例分析编写vue组件方法
2019/02/12 Javascript
Vue中多个元素、组件的过渡及列表过渡的方法示例
2019/02/13 Javascript
浏览器事件循环与vue nextTicket的实现
2019/04/16 Javascript
Angular实现svg和png图片下载实现
2019/05/05 Javascript
Vue-cli4 配置 element-ui 按需引入操作
2020/09/11 Javascript
以windows service方式运行Python程序的方法
2015/06/03 Python
Python使用设计模式中的责任链模式与迭代器模式的示例
2016/03/02 Python
详解python如何调用C/C++底层库与互相传值
2016/08/10 Python
浅谈pandas用groupby后对层级索引levels的处理方法
2018/11/06 Python
python提取包含关键字的整行数据方法
2018/12/11 Python
python实现与redis交互操作详解
2020/04/21 Python
Python+PyQt5实现灭霸响指功能
2020/05/25 Python
python爬虫要用到的库总结
2020/07/28 Python
python批量生成条形码的示例
2020/10/10 Python
匡威帆布鞋美国官网:Converse美国
2016/08/22 全球购物
Origins加拿大官网:雅诗兰黛集团高端植物护肤品牌
2017/11/19 全球购物
Skyscanner澳大利亚:全球领先的旅游搜索网站
2018/03/24 全球购物
荷兰电脑专场:Paradigit
2018/05/05 全球购物
师说教学反思
2014/02/07 职场文书
《会走路的树》教后反思
2014/04/19 职场文书
计算机应用专业毕业生求职信
2014/06/03 职场文书
服务行业演讲稿
2014/09/02 职场文书
2014年销售工作总结范文
2014/12/01 职场文书
Java 定时任务技术趋势简介
2022/05/04 Java/Android
Redis 异步机制
2022/05/15 Redis