说明

魔术方法就是在特定场景下不需要调用而自动执行的方法。因为有魔术方法,所以我们的类可以写得很灵活~

__construct       #构造方法,在类被实例化时自动调用,一般用于初始化操作;

__destruct        #析构方法,对象被销毁时自动调用;

__clone()         #克隆方法,当对象被克隆时,将会自动调用

__get($key)       #属性获取方法,当对象要调用一个被保护或不存在的属性时,__get方法就会自动被调用,并传入调用的属性名称;

__set($key,$val)  # 属性设置方法,当对象设置一个被保护或不存在的属性时,__set会被执行,并传入要设置的属性名称和属性值,注意这里的设置令对象本身没有发生改变,除非更改操作是发生在__set方法内;但无论如何,都不可以为对象增加本来就没有的属性,只有对已有的属性进行操作;

__isset($key)     # 当用isset判断一个对象是否有这个属性,并且这个属性是被保护或者不存在时被自动执行,并传入判断的属性名称;

__unset($key)     # 同上,当用unset删除一个对象的保护属性或未存在的属性时,自动被执行;

__isset($key) #__isset方法如果返回一个为true的值时,isset的判断就会失效,不管本类有没有其判断的属性,isset都会返回真;

__call($method,$arguments)    # 当对象在调用一个被保护或不存在的方法时,会自动执行,并传入两个参数$method为方法吗,$arguments为该方法的参数数组;

__callStatic($method,$arguments)    # 当调用了类当中某个被保护或不存在的静态方法时,会自动执行,并传入两个参数$method为方法,$arguments为该方法的参数数组;注意,是静态方法,并且是php5.3新增的魔术方法;

__toString() # 输出对象引用时自动调用;

__invoke() # $obj = class();$obj()时执行该函数
<?php
#魔术方法概览: class magic{
private $privateProperty = "被保护的属性"; public function __construct(){
echo "我是魔术构造方法,本类被实例化的时候我就会自动执行" . "<hr />";
} public function __toString(){
echo 'hahaha,我是toString';
return $this -> privateProperty;
} public function __invoke(){
echo '类被实例为对象后,可以直接当做方法调用,调用的就是我~';
} public function func(){
echo "这是一个普通的方法 <br />";
} private function privateFunc(){
echo "这是一个被保护的方法 <br />";
} public function __destruct(){
echo "我是析构方法,在对象被销毁(代码执行完、\$obj被赋值为NULL或被unset)时,我会被自动调用 <br />";
echo "<strong>貌似对象被克隆的时候,我也会自动执行</strong><hr />";
} public function __clone(){
echo "我是克隆魔术方法,当对象被clone时,我会被自动执行. <hr />";
} public function __get($key){
echo "我是__get方法,当对象调用一个被保护或不存在的属性时,我会被执行,并传入调用的属性名称 -> {$key} <hr />";
} public function __set($key , $val){
echo "我是__set方法,当对象设置一个被保护或不存在的属性时,我会被执行,并传入要设置的属性名称->\"{$key}\"和属性值->\"{$val}\";<br /><strong>注意,这里的设置并没有令对象本身的属性值发生改变或增加</strong> <hr />";
/*
__set方法的使用:
1.利用本方法预留一个接口,有条件的限制类外部操作类内部被保护的属性;
2.框架中一般private一个$data的数组,用set方法对其增加数组元素,然后来操作这个数组;
*/
} public function __isset($key){
echo "我是__isset方法,当isset判断对象的被保护或不存在属性时,我会被执行,并传入被判断的属性名称 ->\"{$key}\" <br />
<storng>注意,本方法如果返回一个为true的值时,isset的判断就会失效,不管本类有没有其判断的属性 ->\"{$key}\",都会返回真</storng>
<hr />";
return true;
} public function __unset($key){
echo "我是__unset方法,当unset对象的被保护或不存在属性时,我会被执行,并传入要被unset的属性名称 ->\"{$key}\" <hr />";
} public function __call($method , $arguments){
echo "我是__call方法,当对象在调用一个被保护或不存在的方法时,我会被调用,并传入两个参数,\$method ----> \"{$method}\"(方法名); \$arguments ---->(参数数组)";
print_r($arguments);
echo "<hr />";
} public static function __callStatic($method , $arguments){
echo "我是__callStatic方法,当调用了类当中某个被保护或不存在的静态方法时,我会被调用,并传入两个参数,\$method ----> \"{$method}\"(方法名); \$arguments ---->(参数数组)";
print_r($arguments);
echo "<strong>注意:只能是类::staticMethod,并且本方法是php5.3版本才更新的</strong>";
echo "<hr />";
}
} $obj = new magic(); # __invoke $obj(); //5.3以后这样搞就等于是直接调用类里面的__invoke()方法 # __toString
//如果没有__toString就会报错;Object of class magic could not be converted to string
//但是有__toString方法的话,不仅toString方法会被调用,并且还会返回toString中返回的值;
echo $obj; # __clone;
// $obj1 = clone $obj; #__get($key)获取保护和不存在的属性↓↓;
$obj->privateProperty; //调用被保护的属性;
$obj->zxg; //调用不存在的属性; #__set($key,$val)设置保护和不存在的属性↓↓:
print_r($obj);
echo " <hr />";
$obj->privateProperty = "通过__set方法改变了属性值;";
$obj->zxg = "xgg"; //未存在的属性;
print_r($obj);//$obj本身没有发生改变,除非更改操作是发生在__set方法内;但无论如何,都不可以为对象增加属性,只有对已有的属性进行操作;
echo " <hr />"; #__isset($key)方法的使用
echo isset($obj->jyh) ? "有jyh属性(事实上是没有这个属性的,但__isset方法返回真,其就为真)" : "没有jyh属性";
echo " <hr />"; #__unset($key)方法的使用
unset($obj->zxg); #__call($method,$arguments)
$obj->privateFunc('arg1' , 'arg2' , 'arg3'); #__callStatic($method,$arguments)
magic::zhouzhou(27 , 'pig');
?>

PHP魔术方法小结.md的更多相关文章

  1. PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结

      前  言  OOP  学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1  PHP中的抽象 ...

  2. php魔术方法小结

    php魔术方法 __construct() __construct(mixed ...$values = ""): void PHP 允许开发者在一个类中定义一个方法作为构造函数. ...

  3. __set(),__get() 魔术方法示例

    <?php class Ren{private $name;private $age;private $sex;function __set($name,$value){ if($name == ...

  4. php拦截器(魔术方法)

    什么是PHP拦截器? 英文名称 “interceptor”,作用是 拦截 发送未定义的方法和属性的消息. 先看一段代码,定义了一个School类,实例化一个对象$obj,获取一个未定义的属性teach ...

  5. 魔术方法之__call、__callStatic

    1.__call() 作用,当调用不存在的方法时,会调用该方法.实际应用,当程序调用不存在的方法时,意外导致程序终止. .或者当你调用了受保护的或者是私人的方法时,也会自动调用__call方法 结果: ...

  6. Python最会变魔术的魔术方法,我觉得是它!

    在上篇文章中,我有一个核心的发现:Python 内置类型的特殊方法(含魔术方法与其它方法)由 C 语言独立实现,在 Python 层面不存在调用关系. 但是,文中也提到了一个例外:一个非常神秘的魔术方 ...

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

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

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

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

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

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

随机推荐

  1. 转:Apache与Nginx的优缺点比较

    Apache与Nginx的优缺点比较 http://weilei0528.blog.163.com/blog/static/206807046201321810834431/ 1.nginx相对于ap ...

  2. DOS命令之----Netstat+Task以及相关使用

    作为一个初步接触电脑的人,在学习Android的过程中,遇到各种问题,今天遇到了.这样一个错误提示: The connection to adb is down, and a severe error ...

  3. Linux之父Linus Torvalds:讨厌C++

    "Linux内核的创始人Linus Torvalds最近在一封邮件中说明了内核开发需要使用C语言而非C++的理由.在庞大的项目中,人们对不是自己开发的模块并不了解,能快速理解其他模块中函数的 ...

  4. haproxy 安装与配置文件详解

    本文主要阐述haproxy的安装配置详解,对于它的概念,作用,功能,和其它LB软件的区别,优点,缺点等不再进行说明. 一. haproxy 的安装配置 # cat /etc/redhat-releas ...

  5. IE下同样的$.ajax()被调用两次,只能执行一次(第一次)

    今天发现了这个问题,仅限于IE下所有浏览器包括Edge 百度了一下原来问题就在这句话:如果第二次请求与第一次请求完全相同,会直接从缓存获取. 那么就在请求时让URL变得不一样吧 $.ajax({ ty ...

  6. npm,grunt,less,sass,typescript

    typescript   http://www.typescriptlang.org sass   http://sass-lang.com/ less http://lesscss.org/ bow ...

  7. 十二、BOOL冒泡

    int main(){        int a[5] = {5,2,3,4,1};      //需要一个可以告诉我们没有交换的东西      //YES:交换      //NO:未交换     ...

  8. 回溯(su)算法之N皇后问题

    这里回溯算法还要好好研究一下 试探一个位置是否有效,如果有效,试探下一个位置(DFS),如果无效则回退 1.定义一个解空间,存放一个解的空间 2.DFS(暂且认为是DFS) 这里N皇后用的是递归+回溯 ...

  9. [原创] zabbix学习之旅六:如何解决zabbix server在内网,而邮件发送服务器在外网的问题

    通过前面的文章,你已经可以快速地搭建一个报警系统,并能正常的收到报警邮件了.不过在很多企业级环境下,邮件发送服务器往往放在外网,而zabbix server放置在内网,在这种情况下,zabbix的报警 ...

  10. BAT CMD 批处理文件脚本 -2

    http://checheng1988.blog.51cto.com/4725808/1090733 在很多windows程序中会见到很多用扩展名为.bat和.cmd结尾的文件,那么这些文件能干什么呢 ...