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写的小东西
Dec 06 PHP
php实现首页链接查询 友情链接检查的代码
Jan 05 PHP
PHP函数常用用法小结
Feb 08 PHP
php基于socket实现SMTP发送邮件的方法
Mar 05 PHP
PHP面向对象详解(三)
Dec 07 PHP
PHP内核探索之解释器的执行过程
Dec 22 PHP
php简单实现多语言切换的方法
May 09 PHP
浅谈PHP值mysql操作类
Jun 29 PHP
PHP的Json中文处理解决方案
Sep 29 PHP
php 解决扫描二维码下载跳转问题
Jan 13 PHP
解决php扩展安装不生效问题
Oct 25 PHP
PHP获取学生成绩的方法
Nov 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
什么是短波收听SWL
2021/03/01 无线电
php数组函数序列之asort() - 对数组的元素值进行升序排序,保持索引关系
2011/11/02 PHP
php实现rc4加密算法代码
2012/04/25 PHP
php导入大量数据到mysql性能优化技巧
2014/12/29 PHP
PHP+MySQL存储数据常见中文乱码问题小结
2016/06/13 PHP
php实现图片上传时添加文字和图片水印技巧
2020/04/18 PHP
利用switch语句进行多选一判断的实例代码
2016/11/14 PHP
实现PHP中session存储及删除变量
2018/10/15 PHP
Auntion-TableSort国人写的一个javascript表格排序的东西
2007/11/12 Javascript
解决IE6的PNG透明JS插件使用介绍
2013/04/17 Javascript
如何从jQuery的ajax请求中删除X-Requested-With
2013/12/11 Javascript
jQuery实现级联菜单效果(仿淘宝首页菜单动画)
2014/04/10 Javascript
Javascript检查图片大小不要让大图片撑破页面
2014/11/04 Javascript
jquery实现不包含当前项的选择器实例
2015/06/25 Javascript
jQuery基于ajax实现星星评论代码
2015/08/07 Javascript
JS DOM实现鼠标滑动图片效果
2020/09/17 Javascript
浅析jquery unbind()方法移除元素绑定的事件
2016/05/24 Javascript
图文详解Javascript中的上下文和作用域
2017/02/15 Javascript
浅谈webpack组织模块的原理
2018/03/10 Javascript
微信小程序实现九宫格抽奖
2020/04/15 Javascript
Node 代理访问的实现
2019/09/19 Javascript
javascript 高级语法之继承的基本使用方法示例
2019/11/11 Javascript
小程序使用wxs解决wxml保留2位小数问题
2019/12/13 Javascript
JS如何操作DOM基于表格动态展示数据
2020/10/15 Javascript
[54:15]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第二场2月1日
2021/03/11 DOTA
Python中的is和id用法分析
2015/01/26 Python
python中virtualenvwrapper安装与使用
2018/05/20 Python
Python判断是否json是否包含一个key的方法
2018/12/31 Python
Python企业编码生成系统之系统主要函数设计详解
2019/07/26 Python
Python常用GUI框架原理解析汇总
2020/12/07 Python
英国女士和男士时尚服装网上购物:Top Labels Online
2018/03/25 全球购物
澳大利亚最大的网上油画销售画廊:Direct Art Australia
2018/04/15 全球购物
小学生获奖感言范文
2014/02/02 职场文书
培训主管的职业生涯规划
2014/03/06 职场文书
开展批评与自我批评发言材料
2014/10/17 职场文书
走群众路线学习笔记
2014/11/06 职场文书