1、构造函数:__construct():

构造函数是类中的一个特殊函数,当我们使用new关键字实例化对象时,相当于调用了类的构造函数。

function __construct($name){
$this -> name = $name;
}

2、析构函数:__destruct():

①析构函数在对象被销毁释放之前自动调用;
②析构函数不能带有任何的参数;
③析构函数常用于对象使用完以后,释放资源,关闭资源等。

function __destruct(){
echo "over!";
}

3、 __set($key,$value):

给类私有属性赋值时自动调用,调用是给方法传递两个参数:需要设置的属性名、属性值

         function __set($key,$value){
if($key=='name'){
$this->$key=$value."(这是__set设置的文字!)";
return;
}
}

4、 __get($key):

给获取类私有属性时自动调用,调用是给方法传递一个参数:需要获取的属性名

           function __get($key){
return $this->$key;
}

5、 __isset($key):

外部使用isset()函数检测私有属性时,自动调用。
 >>>类外部使用isset();检测私有属性,默认检测不到(false)
 >>>所以,我们可以使用__isset()函数,在自动调用时,返回内部检测结果

function __isset($key){
  return isset($this->$key);
}

当外部使用isset($对象名->私有属性);检测时,将自动调用上述__isset()返回的结果!

6、 __unset($key):

外部使用unset()函数删除私有属性时,自动调用;

function __unset($key){
  unset($this->$key);
}

当外部使用unset($对象名->私有属性);删除属性时,自动将属性名传给__unset(),并交由这个魔术方法处理

7、__clone:

① 当使用clone关键字,克隆对象时,自动调用clone函数
 ② __clone()函数类似于克隆是使用的构造函数,可以给新克隆对象赋初值
 ③ 克隆函数里面的$this指的是新克隆的对象

  class Person{
public $name;
public $age;
function __construct($name,$age){
$this->name=$name;
$this->age=$age;
}
function __clone(){$this->name="李5";
} }
$zhangsan=new Person("张三",14);
$lisi=clone $zhangsan;

8、__tostring()

当使用echo等输出语句,直接打印对象时,调用 echo $zhangsan;那么, 可以指定__tostring()方法的返回值,返回值需要是字符串。
 则使用echo函数打印时,将会打印出__tostring()函数返回的字符串

function __tostring(){
  return "hahaha";
}
echo $zhangsan;

9、__call()

调用类中未定义或未公开的方法时,会自动执行__call()方法,自动执行时,会给call方法传递两个参数:
① 调用的方法名
② (数组)调用的方法的参数列表

     function __call($funcName,$funcParams){
echo "{$funcName}<br>";
print_r($funcParams);
}

10、__autoload()

① 这是唯一一个不在类中使用的魔术方法
② 当实例化一个不存在的类时,自动调用这个魔术方法
③ 调用时,会自动给__autoload()传递一个参数:实例化的类名
所以,可以实现 使用这个方法,自动加载类文件的功能:

function __autoload($className){
  include strtolower($className).".class.php"
}
$zhangdan=new Person("战三");
//本文件没有Person类,会自动执行__autoload加载person.class.php文件

11、__sleep():

① 当执行对象串行化(将对象通过一系列操作,转化为字符串的过程,称为串行化)的时候,会自动执行__sleep()函数;
② __sleep()函数要求返回一个数组,数组中的值,就是可以串行化的属性, 不在数组中的属性,不能被串行化。

function __sleep(){
  return array("name","age");
}

12、__wakeup()

① 当反串行化对象时,自动调用__wakeup()方法;
② 自动调用时,用于给反串行化产生的新对象的属性,进行重新赋值;

function __wakeup(){
  $this->name="李四";
}

OOP的魔术方法的更多相关文章

  1. php部分---面向对象静态、抽象类、oop接口、加载类、魔术方法、关键字。

    静态  static关键字 普通成员普通成员是属于对象的 静态成员静态成员是属于类的 普通方法里面可以调用静态成员静态方法里面不能调用普通成员self关键字 在类里面代表该类 普通类class Ren ...

  2. PHP中的面向对象OOP中的魔术方法

    一.什么是魔术方法: PHP为我们提供了一系列用__开头的函数,这些函数无需自己手动调用,会在合适的时机自动调用,这类函数称为魔术函数.例如: function __construct(){} 在ne ...

  3. php中的魔术方法

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

  4. 面向对象与面向过程 $this的注意事项和魔术方法set和get

    一.面向对象与面向过程的区别: 二者都是一种思想,面向对象是相对于面向过程而言的.面向过程,强调的是功能行为.面向对象,将功能封装进对象,强调具备了功能的对象.面向对象更加强调运用人类在日常的思维逻辑 ...

  5. PHP 中的 9 个魔术方法

    这个标题有点牵强因为php有不只9种魔术方法, 但是这些将会引导你使用php魔术方法一个好的开始.它可能魔幻,但是并不需要魔杖. 这些'魔术'方法拥有者特殊的名字,以两个下划线开始,表示这些方法在ph ...

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

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

  7. PHP开发者必须了解的9个魔术方法

    这些'魔术'方法拥有者特殊的名字,以两个下划线开始,表示这些方法在PHP特定事件下将会被触发.这可能听起来有点自动魔法但是它真的很酷的,我们已经看过一个简单的例子在 last post,即我们使用一个 ...

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

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

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

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

随机推荐

  1. c文件操作整理

    <c陷阱与缺陷> FILE *fp; fp = fopen(file, "r+"); 编程者也许认为,程序一旦执行上述操作完毕,就可以自由地进行读取和写入的操作了.遗憾 ...

  2. Pyinstaller 打包exe

    安装 ​ pip insatll Pyinstaller 参数 pyinstaller -Fw main.py 参数 概述 -F,-onefile 打包一个单个文件,如果你的代码都写在一个.py文件的 ...

  3. 在Winform开发框架中下拉列表绑定字典以及使用缓存提高界面显示速度

    在我们开发Winform界面的时候,往往需要绑定数据字典操作,也就是绑定一些下拉列表或者一些列表显示等,以便我们方便选择数据操作,常见的字典绑定操作就是对下拉列表的处理,本篇随笔是基于DevExpre ...

  4. SFP光模块与SFP+、XFP、QSFP、GBIC、BIDI的区别

    SFP.SFP+.XFP.QSFP.GBIC和BIDI等不同封装类型光模块不断推陈出新,我们就以市场上比较常见的为主,来谈谈它与其他类似光模块的区别. SFP光模块 SFP光模块又称⼩封装可插拔光模块 ...

  5. Tomcat7 JDK8 Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000540000000, 5368709120, 0) failed; error='Cannot allocate memory' (errno=12)

    [root@crm-web- bin]# shutdown.sh bash: shutdown.sh: command not found [root@crm-web- bin]# sh shutdo ...

  6. Visual Studio Code扩展:

    Auto Close TagAuto Rename TagBeautifyChinese (Simplified) Language Pack for Visual Studio CodeClass ...

  7. jmeter学习记录--04--Beanshell

    一.什么是Bean Shell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;BeanShell是一种松散类型的脚本语言(这点和JS类似); BeanSh ...

  8. 注意:QQ影音视频压缩时长丢失

    客户宣传片发来,高清的,比较大,500多M,需要转成小一点的,放在客户网站上,于是用QQ影音转码压缩下,变成低质量的.如下 一切都很顺利,提示进度100%! 这一切都是电脑自动的,又是提示成功的,千想 ...

  9. 解决使用Spring Boot、Multipartfile实现上传提示无法找到文件的问题

    前言 SpringBoot使用MultiPartFile接收来自表单的file文件,然后进行服务器的上传是一个项目最基本的需求,我以前的项目都是基于SpringMVC框架搭建的,所以在使用Spring ...

  10. List、Map、Set之间的联系与区别:

    一.数组和集合的区别: 1.数组的大小是固定的,并且同一个数组只能是相同的数据类型 2.集合的大小是不固定的,在不知道会有多少数据的情况下可使用集合. 二.集合的三种类型:list(列表).set(集 ...