php 魔术方法__get,php常用魔术方法
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常用魔术方法相关推荐
- php魔术方法 效率,PHP常用魔术方法的性能探究
性能往往是衡量代码很重要的一个标准.我们日常编码中经常会用到一些魔术方法,这些PHP提供的魔术方法是否会影响我们程序的性能呢?是否需要减少魔术方法 的使用呢?本文将通过测试对比来了解魔术方法对性能的影 ...
- mysql构造器_类和对象,类的构造器,魔术方法__get()和__set(),mysql连接数据库的方式--2018年8月30日11时38分...
这一节课主要讲的是类和数据库的知识,主要是类和对象,类的构造器,魔术方法__get()和__set(),mysql连接数据库1. 什么是类 ?什么是对象?举例说明 答:类是对象的模板,对象是类的一个实 ...
- php _set魔术方法的用法,PHP魔术方法__GET、__SET使用实例
这篇文章主要介绍了PHP魔术方法__GET.__SET使用实例,本文在代码中做了详细的注释,需要的朋友可以参考下 __get() - 读取不可访问属性的值时,__get() 会被调用. __set() ...
- python魔术方法是什么_Python常用魔术方法
什么是魔术方法? 在Python中,所有以双下划线__包起来的方法,统称为Magic Method(魔术方法),它是一种的特殊方法,普通方法需要调用,而魔术方法不需要调用就可以自动执行. 魔术方法在类 ...
- php 魔术方法__get,PHP魔术方法之__set()和__get()
先来看一段代码: class Article{ //私有成员属性 private $title = '标题'; //受保护的成员属性 protected $author = '作者'; //公有成员属 ...
- invoke 魔术_PHP常用魔术方法(__invoke魔术方法)
PHP5.3魔术方法 __invoke 这个魔幻方法被调用的时机是: 当一个对象当做函数调用的时候, 如果对象定义了__invoke魔幻方法则这个函数会被调用, class Callme { publ ...
- Day20 python__new__、单态模式、析构方法、常用魔术方法、__str__、__repr__、__bool__ 、__len__...
1.魔术方法 __new__ ''' 触发时机:实例化类生成对象的时候触发(触发时机在__init__之前) 功能:控制对象的创建过程 参数:至少一个cls接受当前的类,其他根据情况决定 返回值:通常 ...
- php魔术方法的理解,php魔术方法的认识
在php中将所有以"__"即两个下划线开头的类方法保留为魔术方法,PHP中魔术方法有"__construct()"."__destruct()&quo ...
- python描述符魔术方法_Python类型转换的魔术方法详解
本文讨论python中将某个复杂对象转换为简单对象或数据类型的常用魔术放啊,这些在编程中是十分有用的. 1.__str__方法. 在讲解本方法前我们先打开一个jupyter notebook,随意创建 ...
最新文章
- “此环境变量太大, 此对话框允许将值设置为最长2047个字符”的解决办法
- Node.js Stream(流) 简单易懂全解析
- Cacti性能优化和监控H3C交换机
- 在matlab中将处理结果输出为shp文件
- 1-趣味解读DNS工作原理——转载疯猫网络科技
- leetcode416. Partition Equal Subset Sum
- 学习PWM的一些总结
- cad布局教程_CAD制图初学入门之常见的CAD打印设置汇总
- 如何10分钟入门3D游戏开发?
- python 列表 字典 读写文件:pickle模块的基本使用
- 数据库原理归档——对于数据库原理最全的总结
- 计算机专业大学排名_U.S.News全美大学排名出炉:UCLA超越伯克利;计算机MIT排第一,斯坦福跌出前四...
- android studio证件照代码,Android 修图(换证件照背景,污点修复)
- oracle定时加载文件,采用sqlldr定时将文本文件加载进入数据库
- leetcode_Basic Calculator II
- java EE :GenericServlet 抽象类、ServletConfig 接口
- 林锐——我的大学十年
- Ajax原生XHR和Promise 学习
- ssl证书显示错误怎么办。
- 前端:一篇彻底搞懂vuex中dispatch与commit的使用及差异