1.构造函数__construct()和析构函数__desctruct()分别在对象创建和销毁时被调用。对象被“销毁”是指不存在任何对该对象的引用,比如引用该对象的变量被删除(unset)、重新赋值或脚本执行结束,都会调用析构函数。

2.__tostring()方法:对象被当作string(字符串)使用时(如echo $obj),此方法自动调用,此方法中须返回(return)一个字符串

__invoke()方法:对象被当作方法调用时(如$obj()),此方法自动调用

属性重载

3.__call(),在对象中调用一个不可访问方法时调用

__callStatic(),用静态方式中调用一个不可访问方法时调用

4.__get():读取不可访问或不存在属性的值时,__get()会被调用 定义function __get($name)

__set():在给不可访问属性赋值时,__set()会被调用 定义function __set($name,$value)

isset():当对不可访问属性调用isset()或empty()时,__isset()会被调用

unset():当对不可访问的属性调用unset()时,__unset()会被调用

5.__clone克隆:当对一个对象使用clone关键字时,该魔术方法会被调用。在这个魔术方法里,我们可以实现任何子对象的克隆

默认的,对象都是按引用传值的。因此,在将一个对象赋值给另一个变量时,只是创建了指向该对象的一个引用,并没有复制该对象。为了实现真正得复制一个对象,我们需要使用clone关键字。

class MagicTest{

//1.__tostring()方法:对象被当作string(字符串)使用时(如echo $obj),此方法自动调用,此方法中须返回(return)一个字符串

public function __tostring(){

return "This is the Class MagicTest.";//return

}

//2.__invoke()方法:对象被当作方法调用时(如$obj()),此方法自动调用

public function __invoke($x){

echo "__invoke called with parameter ".$x."";

}

//当对象访问不存在的方法名称时,_call方法会被自动调用

//方法的重载overloading;此方法必须有两个参数,第一个参数就是调用的未定义方法的名称,第二个参数是未定义方法调用的参数组成的数组

public function __call($name,$arguments){

echo "Calling ".$name." with parameters:".implode(',',$arguments)."";

}

//当对象访问不存在的静态方法名称时,callStatic()方法会被自动调用

//静态方法的重载,注意这个方法需要设定为static

public static function __callStatic($name,$arguments){

echo "Static calling ".$name." with parameters:".implode(',',$arguments)."";

}

}

$obj = new MagicTest();

echo $obj."";//This is the Class MagicTest.

$obj('hh');//__invoke called with parameter hh

$obj->calltest('par1','par2');//Calling calltest with parameters:par1,par2

MagicTest::calltest('par1','par2');//Static calling calltest with parameters:par1,par2

?>

属性重载

class MagicTest{

/**

1读取不可访问或不存在属性的值时,__get()会被调用 定义function __get($name)

2在给不可访问属性赋值时,__set()会被调用 定义function __set($name,$value)

3当对不可访问属性调用isset()或empty()时,__isset()会被调用

4当对不可访问的属性调用unset()时,__unset()会被调用

5所谓不可访问属性,实际上就是在调用某个属性时发现这个属性没有被定义,这时候不同的操作会触发不同的魔术方法

6这几个方法也被成为属性重载的魔术方法

7属性重载只能在对象中进行。在静态方法中,这些魔术方法将不会被调用。所以这些方法都不能被 声明为 static。从 PHP 5.3.0 起, 将这些魔术方法定义为 static 会产生一个警告。

*/

public function __get($name){

return "Getting the property ".$name;

}

public function __set($name,$value){

echo "Setting the property ".$name." to the value ".$value."";

}

public function __isset($name){

echo "isset called";

return true;//isset时true

//return false;//empty时false

}

public function __unset($name){

echo "unsetting called ".$name."
";

}

}

$obj = new MagicTest();

echo $obj->proName."";

$obj->proName = "Magicname";

echo '$obj->className is set? '.isset($obj->className)."
";//return true;时$obj->className is set? 1

echo '$obj->className is empty? '.empty($obj->className)."
";//return false;时$obj->className is empty? 1

unset($obj->className);

?>

3.__clone克隆魔术方法

//当希望生成一个真正独立存储的 NbaPlayer() 对象,但新对象的 所有数据 都和 $james 对象中的 相同时,使用关键字 clone

//当class NbaPlayer()中定义了 __clone()方法 后,使用clone关键字时,系统将调用 用户定义的__clone()方法 (此时可以对clone 后生成的新对象的属性进行修改)

class NbaPlayer{

public $name;

function __clone(){

$this->name = 'TBD';//__clone()在 clone一个new的变量时 希望和clone过来的初始值不一样可以用这个函数在下面$this->name = "tbd";去实现克隆后的初始值不一样的效果。

}

}

$james = new NbaPlayer();

$james->name = 'James';

echo $james->name."
";

//clone关键字

$james2 = clone $james;

echo "Before set up:James2's ".$james2->name."
";

$james2->name = 'James2';

echo "James's ".$james->name."
";

echo "James2's ".$james2->name."
";

?>

php 魔术方法__get,php常用魔术方法相关推荐

  1. php魔术方法 效率,PHP常用魔术方法的性能探究

    性能往往是衡量代码很重要的一个标准.我们日常编码中经常会用到一些魔术方法,这些PHP提供的魔术方法是否会影响我们程序的性能呢?是否需要减少魔术方法 的使用呢?本文将通过测试对比来了解魔术方法对性能的影 ...

  2. mysql构造器_类和对象,类的构造器,魔术方法__get()和__set(),mysql连接数据库的方式--2018年8月30日11时38分...

    这一节课主要讲的是类和数据库的知识,主要是类和对象,类的构造器,魔术方法__get()和__set(),mysql连接数据库1. 什么是类 ?什么是对象?举例说明 答:类是对象的模板,对象是类的一个实 ...

  3. php _set魔术方法的用法,PHP魔术方法__GET、__SET使用实例

    这篇文章主要介绍了PHP魔术方法__GET.__SET使用实例,本文在代码中做了详细的注释,需要的朋友可以参考下 __get() - 读取不可访问属性的值时,__get() 会被调用. __set() ...

  4. python魔术方法是什么_Python常用魔术方法

    什么是魔术方法? 在Python中,所有以双下划线__包起来的方法,统称为Magic Method(魔术方法),它是一种的特殊方法,普通方法需要调用,而魔术方法不需要调用就可以自动执行. 魔术方法在类 ...

  5. php 魔术方法__get,PHP魔术方法之__set()和__get()

    先来看一段代码: class Article{ //私有成员属性 private $title = '标题'; //受保护的成员属性 protected $author = '作者'; //公有成员属 ...

  6. invoke 魔术_PHP常用魔术方法(__invoke魔术方法)

    PHP5.3魔术方法 __invoke 这个魔幻方法被调用的时机是: 当一个对象当做函数调用的时候, 如果对象定义了__invoke魔幻方法则这个函数会被调用, class Callme { publ ...

  7. Day20 python__new__、单态模式、析构方法、常用魔术方法、__str__、__repr__、__bool__ 、__len__...

    1.魔术方法 __new__ ''' 触发时机:实例化类生成对象的时候触发(触发时机在__init__之前) 功能:控制对象的创建过程 参数:至少一个cls接受当前的类,其他根据情况决定 返回值:通常 ...

  8. php魔术方法的理解,php魔术方法的认识

    在php中将所有以"__"即两个下划线开头的类方法保留为魔术方法,PHP中魔术方法有"__construct()"."__destruct()&quo ...

  9. python描述符魔术方法_Python类型转换的魔术方法详解

    本文讨论python中将某个复杂对象转换为简单对象或数据类型的常用魔术放啊,这些在编程中是十分有用的. 1.__str__方法. 在讲解本方法前我们先打开一个jupyter notebook,随意创建 ...

最新文章

  1. “此环境变量太大, 此对话框允许将值设置为最长2047个字符”的解决办法
  2. Node.js Stream(流) 简单易懂全解析
  3. Cacti性能优化和监控H3C交换机
  4. 在matlab中将处理结果输出为shp文件
  5. 1-趣味解读DNS工作原理——转载疯猫网络科技
  6. leetcode416. Partition Equal Subset Sum
  7. 学习PWM的一些总结
  8. cad布局教程_CAD制图初学入门之常见的CAD打印设置汇总
  9. 如何10分钟入门3D游戏开发?
  10. python 列表 字典 读写文件:pickle模块的基本使用
  11. 数据库原理归档——对于数据库原理最全的总结
  12. 计算机专业大学排名_U.S.News全美大学排名出炉:UCLA超越伯克利;计算机MIT排第一,斯坦福跌出前四...
  13. android studio证件照代码,Android 修图(换证件照背景,污点修复)
  14. oracle定时加载文件,采用sqlldr定时将文本文件加载进入数据库
  15. leetcode_Basic Calculator II
  16. java EE :GenericServlet 抽象类、ServletConfig 接口
  17. 林锐——我的大学十年
  18. Ajax原生XHR和Promise 学习
  19. ssl证书显示错误怎么办。
  20. 前端:一篇彻底搞懂vuex中dispatch与commit的使用及差异

热门文章

  1. Linux删除swapfile
  2. Java入门第111课——集合addAll、containsAll的用法
  3. 网页规划与设计HTML5+CSS大作业——响应式个人简历介绍(5页)-模板下载
  4. 为适合做网络营销的企业排排队 上海添力
  5. 小程序开发必备功能的吐血整理【个人中心界面样式大全】
  6. 【Git学习】git常用命令
  7. Git实战技巧-日常工作总结
  8. ASP.NET 中英文切换(C#版)
  9. Bulma中文文档地址
  10. Java:怎么判断一个字节数组包含另一个字节数组,并且字节顺序一致