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新手上路(三)
Oct 09 PHP
php5 apache 2.2 webservice 创建与配置(java)
Jan 27 PHP
PHP函数nl2br()与自定义函数nl2p()换行用法分析
Apr 02 PHP
php实现图片按比例截取的方法
Feb 06 PHP
利用php-cli和任务计划实现刷新token功能的方法
May 03 PHP
bindParam和bindValue的区别以及在Yii2中的使用详解
Mar 12 PHP
php原生数据库分页的代码实例
Feb 18 PHP
浅谈php使用curl模拟多线程发送请求
Mar 08 PHP
Laravel路由研究之domain解决多域名问题的方法示例
Apr 04 PHP
PHP实现微信提现(企业付款到零钱)
Aug 01 PHP
Yii框架通过请求组件处理get,post请求的方法分析
Sep 03 PHP
PHP字符串与数组处理函数用法小结
Jan 07 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
windows环境下使用Composer安装ThinkPHP5
2018/05/18 PHP
PHP SESSION机制的理解与实例
2019/03/22 PHP
javascript不同页面传值的改进版
2008/09/30 Javascript
Javascript匿名函数的一种应用 代码封装
2010/06/27 Javascript
qTip 基于JQuery的Tooltip插件[兼容性好]
2010/09/01 Javascript
一个js过滤空格的小函数
2014/10/10 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
2014/10/17 Javascript
浅谈使用MVC模式进行JavaScript程序开发
2015/11/10 Javascript
Immutable 在 JavaScript 中的应用
2016/05/02 Javascript
selenium 与 chrome 进行qq登录并发邮件操作实例详解
2017/04/06 Javascript
微信小程序图片横向左右滑动案例
2017/05/19 Javascript
json2.js 入门教程之使用方法与实例分析
2017/09/14 Javascript
基于 Vue.js 之 iView UI 框架非工程化实践记录(推荐)
2017/11/21 Javascript
支付宝小程序tabbar底部导航
2018/11/06 Javascript
jQuery+vue.js实现的多选下拉列表功能示例
2019/01/15 jQuery
js实现通过开始结束控制的计时器
2019/02/25 Javascript
JavaScript实现指定数量的并发限制的示例代码
2020/03/10 Javascript
可拖拽组件slider.js使用方法详解
2020/12/04 Javascript
[02:15]你好,这就是DOTA!
2015/08/05 DOTA
python编写微信远程控制电脑的程序
2018/01/05 Python
python 猴子补丁(monkey patch)
2019/06/26 Python
python3 requests库文件上传与下载实现详解
2019/08/22 Python
Tensorflow中的dropout的使用方法
2020/03/13 Python
Numpy中ndim、shape、dtype、astype的用法详解
2020/06/14 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
2020/11/24 Python
HTML5超文本标记语言的实现方法
2020/09/24 HTML / CSS
销售所有的狗狗产品:Dog.com
2016/10/13 全球购物
Tessabit美国:集世界奢侈品和设计师品牌的意大利精品买手店
2020/06/29 全球购物
《梅兰芳学艺》教学反思
2014/02/24 职场文书
公司保密承诺书
2014/03/27 职场文书
党员评议自我评价
2015/03/03 职场文书
心灵捕手观后感
2015/06/02 职场文书
国际贸易实训总结
2015/08/03 职场文书
2016年社会管理综治宣传月活动总结
2016/03/16 职场文书
Python上下文管理器Content Manager
2021/06/26 Python
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
2021/08/07 HTML / CSS