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写杨辉三角实例代码
Jul 17 PHP
php遍历数组的方法分享
Mar 22 PHP
基于simple_html_dom的使用小结
Jul 01 PHP
分享下页面关键字抓取components.arrow.com站点代码
Jan 30 PHP
ThinkPHP CURD方法之table方法详解
Jun 18 PHP
ThinkPHP3.1新特性之字段合法性检测详解
Jun 19 PHP
PHP编写RESTful接口
Feb 23 PHP
Django中的cookie与session操作实例代码
Aug 17 PHP
PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例
Mar 01 PHP
apache集成php7.3.5的详细步骤
Jun 20 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
Dec 01 PHP
PHP设计模式之建造者模式(Builder)原理与用法案例详解
Dec 12 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
3.从实例开始
2006/10/09 PHP
php 获取页面中指定内容的实现类
2014/01/23 PHP
PHP制作百度词典查词采集器
2015/01/29 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
php生成HTML文件的类方法
2019/10/11 PHP
jquery showModelDialog的使用方法示例详解
2013/11/19 Javascript
如何使用Vuex+Vue.js构建单页应用
2016/10/27 Javascript
解析Vue2 dist 目录下各个文件的区别
2017/11/22 Javascript
深入浅析Vue中的Prop
2018/06/10 Javascript
webpack4与babel配合使es6代码可运行于低版本浏览器的方法
2018/10/12 Javascript
利用angular自动编译andriod APK的绕坑经历分享
2019/03/08 Javascript
在Vue项目中使用jsencrypt.js对数据进行加密传输的方法
2019/04/17 Javascript
javascript头像上传代码实例
2019/09/28 Javascript
Python内置的字符串处理函数详细整理(覆盖日常所用)
2014/08/19 Python
Python爬取读者并制作成PDF
2015/03/10 Python
Python全局变量用法实例分析
2016/07/19 Python
pygame加载中文名mp3文件出现error
2017/03/31 Python
Python队列的定义与使用方法示例
2017/06/24 Python
Java实现的执行python脚本工具类示例【使用jython.jar】
2018/03/29 Python
使用python将时间转换为指定的格式方法
2018/11/12 Python
python函数的万能参数传参详解
2019/07/26 Python
TENSORFLOW变量作用域(VARIABLE SCOPE)
2020/01/10 Python
python正则表达式re.match()匹配多个字符方法的实现
2021/01/27 Python
HTML5重塑Web世界它将如何改变互联网
2012/12/17 HTML / CSS
html5生成柱状图(条形图)效果的实例代码
2016/03/25 HTML / CSS
解释一下ArrayList Vector和LinkedList的实现和区别
2013/04/26 面试题
斯福泰克软件测试面试题
2015/02/16 面试题
自主实习接收函
2014/01/13 职场文书
公司办公室岗位职责
2014/03/19 职场文书
小学生清明节演讲稿
2014/09/05 职场文书
基层党组织建设整改方案
2014/09/16 职场文书
城南旧事电影观后感
2015/06/16 职场文书
休学证明范本
2015/06/19 职场文书
呼啸山庄读书笔记
2015/06/29 职场文书
Axios取消重复请求的方法实例详解
2021/06/15 Javascript
python语言中pandas字符串分割str.split()函数
2022/08/05 Python