php魔术方法的使用
本文测试环境为 php5.5.12
一、__get 、__set
将对象的属性进行接管。
一般来说,总是把类的属性定义为private,但是对属性的读取和赋值操作非常频繁,在php5+,预定义__set() 和__get()来获取和赋值其属性。即私有成员的设置和取值操作。
这两个方法需要手动添加到类中。如下:
public function __set($name,$value){
$this->name=$value;
}
public function __get($name){
return $this->name;
}
注意:网上目前有一些文章列举出这两个方法可以设置成private和static,本人在此表示,不要相信,因为在老版本的php中这么使用不会有什么问题,但是在新版本中,会提示warning错误,提示“Warning:The magic method __get() must have public visibility and cannot be static in......”
完整示例如下:
<?php
namespace Libs; class Person
{
public $name;
public $age;
public $gender;
public function __set($property_name,$val)
{
echo "您调用了魔术方法__set,对私有属性{$property_name}进行了赋值{$val}的操作<br/>";
$this->$property_name = $val;
}
public function __get($property_name)
{
echo "您调用了魔术方法__get,取到了私有属性{$property_name}的值<br/>";
return $this->$property_name;
} }
调用:
$p = new Person();
$p->name = "Jason";
$p->gender = "man";
$p->age=21; echo $p->name;
推荐阅读:php __set __get __isset __unset用法防被忽悠分析
二、__call 、__callStatic
用来控制php对象的方法/静态方法调用.
为了避免当调用的方法不存在时产生错误,可以使用__call()方法来避免,该方法在调用的方法不存在时会自动调用,程序仍然会继续执行下去。
示例如下使用
<?php
namespace Libs; class Person
{ public function __call($function_name,$args)
{
echo "您调用了不存在的方法$function_name<br/>";
echo "传递的参数是:";
var_dump($args);
}
} $p = new Person();
$p->getCountry("Json","21","1");
输出结果:
您调用了不存在的方法getCountry
传递的参数是:
array (size=3)
0 => string 'Json' (length=4)
1 => string '21' (length=2)
2 => string '1' (length=1)
当调用一个类的不存在的静态方法时,我们不使用__call() 而是使用__callStatic()
这里有一个需要注意的地方,__callStatic的属性必须为public+static
示例如下:
<?php namespace Libs; class Person
{
public static function __callstatic($function_name,$args)
{
echo "您调用了不存在的静态方法$function_name<br/>";
echo "传递的参数是:";
var_dump($args);
}
} $p = new Person();
$p::getCountry("Json","21","1");
输出为:
您调用了不存在的静态方法getCountry
传递的参数是:
array (size=3)
0 => string 'Json' (length=4)
1 => string '21' (length=2)
2 => string '1' (length=1)
推荐阅读:PHP魔术方法之__call与__callStatic方法
三、__toString
将php对象转换为字符串。
当我们调试程序时,如果想用echo 打印一个对象,在没有定义__toString()是会报错的。
例如下面的代码:
<?php
namespace Libs; class Person
{ public function test()
{ }
} $p = new Person();
echo $p;
报错如下
( ! ) Catchable fatal error: Object of class Libs\Person could not be converted to string in ...... | ||||
---|---|---|---|---|
Call Stack | ||||
# | Time | Memory | Function | Location |
1 | 0.0009 | 244264 | {main}( ) | ..\2.php:0 |
如果类定义了__toString()方法,就能在测试时,echo打印对象体,对象会自动调用他所属类定义的toString方法,格式化输出这个对象所包含的数据。
示例如下
<?php
namespace Libs; class Person
{ private $name;
public function __construct()
{
$this->name="Hello World!";
}
public function __toString()
{ return __CLASS__."'s property name is ".$this->name;
}
} $p = new Person();
echo $p;
打印输出
Libs\Person's property name is Hello World!
推荐阅读:php面向对象之__toString()
四、__invoke
将php对象当成函数。
官网给出的定义:
mixed __invoke([$...])
当尝试以调用函数的方式调用一个对象时,__invoke()方法会被自动调用。
Note:本特性只在PHP5.3.0及以上版本有效。
代码如下
<?php
class CallableClass
{
function __invoke($x) {
var_dump($x);
}
}
$obj = new CallableClass;
$obj(5);
var_dump(is_callable($obj));
?>
输出结果
int(5)
bool(true)
php魔术方法的使用的更多相关文章
- PHP基础知识之魔术方法
__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sle ...
- 前端学PHP之面向对象系列第二篇——魔术方法
× 目录 [1]构造方法 [2]析构方法 [3]不可访问属性[4]对象复制[5]字符串[6]对象不存在[7]自动加载类[8]串行化[9]函数调用 前面的话 php在面向对象部分有很多相关的魔术方法,这 ...
- PHP中的魔术方法(2)
1.__get.__set这两个方法是为在类和他们的父类中没有声明的属性而设计的__get( $property ) 当调用一个未定义的属性时访问此方法__set( $property, $value ...
- 魔术方法__sleep 和 __wakeup
感觉序列化和反序列化用得倒是比较少了,而json_encode和json_decode用得相对多,都是转化成串,进行入库.传输等.json更方便,但是序列化和反序列化结合这两个魔术方法使用倒还行< ...
- Python魔术方法-Magic Method
介绍 在Python中,所有以"__"双下划线包起来的方法,都统称为"Magic Method",例如类的初始化方法 __init__ ,Python中所有的魔 ...
- php魔术方法使用场景
php魔术方法-----__tostring(),__invoke,__call(),__callStatic ... __tostring(),__invoke() __tostring()方法是在 ...
- PHP中的魔术方法:__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone and __autoload
1.__get.__set 这两个方法是为在类和他们的父类中没有声明的属性而设计的: __get( $property ) 当调用一个未定义的属性时访问此方法: __set( $property, $ ...
- PHP 类中的魔术方法
定义: PHP类中以两个下画线“__”开头的方法被称为魔术方法. 分类: 例如:构造方法:__construct:析构方法:__destruct:动态重载:__set().__get().__call ...
- php中的魔术方法
__construct 构造器是一个魔术方法,当对象被实例化时它会被调用.在一个类声明时它常常是第一件做的事但是没得必要他也像其他任何方法在类中任何地方都可以声明,构造器也能像其他方法样继承.如果我们 ...
- PHP面向对象之魔术方法复习
魔术方法复习 2014-9-2 10:08:00 NotePad++ By jiancaigege 飞鸿影~========================= 1.__construct() 构造方法 ...
随机推荐
- 最短路径算法 4.SPFA算法(1)
今天所说的就是常用的解决最短路径问题最后一个算法,这个算法同样是求连通图中单源点到其他结点的最短路径,功能和Bellman-Ford算法大致相同,可以求有负权的边的图,但不能出现负回路.但是SPFA算 ...
- AVL重平衡细节——插入
话说这个系列鸽了好久,之前在准备语言考试,就没管博客了,现在暑假咱们继续上路! 每当我们进行一次插入之后,整棵AVL树的平衡性就有可能发生改变,为了控制整棵树的高度,我们需要通过一系列变换(重平衡)来 ...
- java 解析xml 多命名空间问题
先贴段有命名空间的xml吧.. <feed xmlns:im="http://itunes.apple.com/rss" xmlns="http://www.w3. ...
- 13 ThreadLocal
ThreadLocal 在多线程环境下,每个线程都有自己的数据.一个线程使用自己的局部变量比使用全局变量好,因为局部变量只有线程自己能看见,不会影响其他线程,而全局变量的修改必须加锁. 1. 使用函数 ...
- 521. [NOIP2010] 引水入城 cogs
521. [NOIP2010] 引水入城 ★★★ 输入文件:flow.in 输出文件:flow.out 简单对比时间限制:1 s 内存限制:128 MB 在一个遥远的国度,一侧是风景秀 ...
- ASP.NET MVC 使用jquery.form.js 异步上传 在IE下返回值被变为下载的解决办法
错误记录: <script type="text/javascript"> $(function () { $(document).off("ajaxSend ...
- 2015年开源前端框架盘点TOP20
2015年,榜单根据github上star数作为排名依据.(榜单中大部分为组件式框架, react.Angular等基础框架不在此篇讨论) 1.Bootstrap 类别/语言:HTML.CSS.Jav ...
- cocos2d-x环境搭建 摘自百度文库
cocos2d-x环境搭建 引言:笔者在网上寻觅了很多资料,最终发现了这份实际可用的文档,供大家参考.源地址:http://wenku.baidu.com/view/93f7b0f1102de2bd9 ...
- 最短路径——Dijkstra算法以及二叉堆优化(含证明)
一般最短路径算法习惯性的分为两种:单源最短路径算法和全顶点之间最短路径.前者是计算出从一个点出发,到达所有其余可到达顶点的距离.后者是计算出图中所有点之间的路径距离. 单源最短路径 Dijkstra算 ...
- iOS-开发,拨打电话
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"te ...