本文测试环境为 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魔术方法的使用的更多相关文章

  1. PHP基础知识之魔术方法

    __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sle ...

  2. 前端学PHP之面向对象系列第二篇——魔术方法

    × 目录 [1]构造方法 [2]析构方法 [3]不可访问属性[4]对象复制[5]字符串[6]对象不存在[7]自动加载类[8]串行化[9]函数调用 前面的话 php在面向对象部分有很多相关的魔术方法,这 ...

  3. PHP中的魔术方法(2)

    1.__get.__set这两个方法是为在类和他们的父类中没有声明的属性而设计的__get( $property ) 当调用一个未定义的属性时访问此方法__set( $property, $value ...

  4. 魔术方法__sleep 和 __wakeup

    感觉序列化和反序列化用得倒是比较少了,而json_encode和json_decode用得相对多,都是转化成串,进行入库.传输等.json更方便,但是序列化和反序列化结合这两个魔术方法使用倒还行< ...

  5. Python魔术方法-Magic Method

    介绍 在Python中,所有以"__"双下划线包起来的方法,都统称为"Magic Method",例如类的初始化方法 __init__ ,Python中所有的魔 ...

  6. php魔术方法使用场景

    php魔术方法-----__tostring(),__invoke,__call(),__callStatic ... __tostring(),__invoke() __tostring()方法是在 ...

  7. PHP中的魔术方法:__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone and __autoload

    1.__get.__set 这两个方法是为在类和他们的父类中没有声明的属性而设计的: __get( $property ) 当调用一个未定义的属性时访问此方法: __set( $property, $ ...

  8. PHP 类中的魔术方法

    定义: PHP类中以两个下画线“__”开头的方法被称为魔术方法. 分类: 例如:构造方法:__construct:析构方法:__destruct:动态重载:__set().__get().__call ...

  9. php中的魔术方法

    __construct 构造器是一个魔术方法,当对象被实例化时它会被调用.在一个类声明时它常常是第一件做的事但是没得必要他也像其他任何方法在类中任何地方都可以声明,构造器也能像其他方法样继承.如果我们 ...

  10. PHP面向对象之魔术方法复习

    魔术方法复习 2014-9-2 10:08:00 NotePad++ By jiancaigege 飞鸿影~========================= 1.__construct() 构造方法 ...

随机推荐

  1. 41-Individual authentication 模板

    1-创建项目,进入vscode控制台,输出如下命令, uld表示指定mssqllocaldb E:\coding\netcore>dotnet new mvc -au Individual -u ...

  2. 集成运放输入电压范围指标参数Uicmax,Uidmax

    图中Uicmax最大共模输入电压:是运放能正常工作下的最大输入电压: Uidmax最大差模输入电压:是运放要损坏的最大输入电压

  3. DDL失败案例

    问题描述 今天对线上某个业务的大表120G进行重建表操作时遇到报错,该表有个比较显著的特征是*写入量比较大,每天写入加更新的频率在数千万级别.大致的环境 1 版本:Percona 5.6.24 2 操 ...

  4. 【python3.X】python练习笔记[1]

    ##三位数水仙花 ##方法一,小于指定数字的水仙花数 x=eval(input()) a,b,c = 0,0,0 for i in range (100,x,1): a=i%10 b=i//100 c ...

  5. Less入门教程

    http://www.cnblogs.com/fsjohnhuang/p/4187675.html

  6. C++学习009预处理器指令符号 # ## #@ 符号的使用

    # ## #@ 符号是预处理器指令符号. 当预处理器遇到#指令符号时,会将#之后的部分用双引号括起来 当预处理去遇到##指令符号时,直接将##前后部分连接起来 当预处理器遇到#@指令符号,将#@之后的 ...

  7. 自动化测试学习之路--java 数组

    数组的定义与为数组元素分配空间和赋值是分开进行的,称为动态初始化. 在数组定义的同时就为数组元素分配空间并赋值,称为静态初始化. 一维数组举例: //动态初始化 int[] intArr; intAr ...

  8. linux备忘录-系统服务daemon

    服务(daemon)及其分类 Linux中的服务被称为daemon(daemon是守护神,恶鬼的意思哦).这些daemon会常驻在内存当中,从而对我们的系统和任务等进行一些辅助性的工作.实际上,dae ...

  9. Linux yum安装MySQL5.7,及远程连接mysql(亲测有效!)

    一.安装配置MySQL的yum源 # 安装MySQL的yum源,下面是RHEL6系列的下载地址 rpm -Uvh http://dev.mysql.com/get/mysql-community-re ...

  10. linux基本操作2

    将当前用户目录下的文件清单输出到文件list1.txt(当前用户目录下)中ls -l > list1.txt 利用管道命令将根(/)下所有修改日期在4月16日的文件清单输出到list2.txt( ...