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和ACCESS写聊天室(五)
Oct 09 PHP
中篇:安装及配置PHP
Dec 13 PHP
PHP strtotime函数详解
Dec 18 PHP
那些年一起学习的PHP(二)
Mar 21 PHP
浅析SVN常见问题及解决方法
Jun 21 PHP
PHP中soap的用法实例
Oct 24 PHP
php使用FFmpeg接口获取视频的播放时长、码率、缩略图以及创建时间
Nov 07 PHP
PHP面向对象程序设计类的定义与用法简单示例
Dec 27 PHP
PHP中Cookie的使用详解(简单易懂)
Apr 28 PHP
thinkPHP多表查询及分页功能实现方法示例
Jul 03 PHP
Laravel6.18.19如何优雅的切换发件账户
Jun 14 PHP
phpStorm2020 注册码
Sep 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类的注册与自动加载
2013/07/05 PHP
ExtJS的FieldSet的column列布局
2009/11/20 Javascript
封装的jquery翻页滚动(示例代码)
2013/11/18 Javascript
用JS实现3D球状标签云示例代码
2013/12/01 Javascript
二叉树先序遍历的非递归算法具体实现
2014/01/09 Javascript
jQuery地图map悬停显示省市代码分享
2015/08/20 Javascript
Javascript闭包与函数柯里化浅析
2016/06/22 Javascript
AngularJS 2.0入门权威指南
2016/10/08 Javascript
微信小程序实战之自定义模态弹窗(8)
2017/04/18 Javascript
vue获取input输入值的问题解决办法
2017/10/17 Javascript
NodeJS加密解密及node-rsa加密解密用法详解
2018/10/12 NodeJs
详解微信小程序框架wepy踩坑记录(与vue对比)
2019/03/12 Javascript
[01:07:02]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第三场 2月26日
2021/03/11 DOTA
python数据结构之链表详解
2017/09/12 Python
浅谈python3中input输入的使用
2019/08/02 Python
关于python导入模块import与常见的模块详解
2019/08/28 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
2020/01/18 Python
python如何随机生成高强度密码
2020/08/19 Python
css3新单位vw、vh的使用教程
2018/03/23 HTML / CSS
html5 Canvas画图教程(1)—画图的基本常识
2013/01/09 HTML / CSS
利用HTML5绘制点线面组成的3D图形的示例
2015/05/12 HTML / CSS
Top Villas美国:豪华别墅出租和度假屋
2018/07/10 全球购物
轻松制作精彩视频:Animoto
2018/09/19 全球购物
美国中西部家用医疗设备商店:Med Mart(轮椅、踏板车、升降机等)
2019/04/26 全球购物
环境科学毕业生自荐信
2013/11/21 职场文书
项目专员岗位职责
2013/12/04 职场文书
就业协议书怎么填
2014/04/11 职场文书
法学自荐信
2014/06/20 职场文书
写得不错的求职信范文
2014/07/11 职场文书
村主任“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
学校2014年度工作总结
2014/12/06 职场文书
2015出纳试用期工作总结
2014/12/12 职场文书
图解上海144收音机
2021/04/22 无线电
使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)
2021/06/09 Vue.js
Android基础入门之dataBinding的简单使用教程
2022/06/21 Java/Android
Win10服务全部禁用了怎么启动?Win10服务全部禁用解决方法
2022/09/23 数码科技