玩转PHP魔术方法

版权声明:俗世凡人行(释) QQ:748507607 https://blog.csdn.net/weixin_41887155/article/details/86235658

目录

一: 魔术方法之构造方法

二: 魔术方法之析构方法

三: 魔术方法之自动加载

四: 魔术方法之__toString()容错处理

五: 魔术方法之__clone

六: __sleep()

七: __wakeup()


魔术方法

魔术方法的概念:  以两个_ _开头,在类的内部定义,在某种特定的情况下被对象自动调用的方法;

魔术函数是PHP中内置的语言特性,当程序执行到某种情况时,如果定义了这些魔术函数,则PHP会调用他们,同时也会传入相应的参数,可以认为是PHP执行过程中的钩子函数。常见的魔术函数有__construct, __destruct , __call, __get, __set, __isset, __unset ,__sleep, __wakeup, __toString, __clone 以及__autoload 。它们可以用来自动加载包含文件,实现延迟执行(类似于.Net中的属性访问器)、垃圾回收、对象clone 等操作;


一: 魔术方法之构造方法

1.概念: 对象在实例化后会自动调用的方法;

扫描二维码关注公众号,回复: 5230408 查看本文章

2.语法: 

__constrcut()

3.作用:    主要是对对象的属性进行初始化

<?php
class Father
{
	public $name;
	protected $age;
	private $money;

	//构造方法必须是公共的,主要是给属性进行初始化赋值
	//定义一个构造方法对对象属性进行初始化赋值
	public function __construct($name,$age,$money)
	{
		$this->name=$name;
		$this->age=$age;
		$this->money=$money;
	}

	function say()
	{
		echo "我父亲的名字叫:".$this->name."<br />";
		echo "我父亲的年龄是:".$this->age."<br />";
		echo "我父亲的私房钱有:".$this->money;
	}
}

//实例化一个类
$f = new Father('曾工',60,20000); //类里面有构造方法时,必须加括号传参数
$f->say();

?>

效果:

我父亲的名字叫:曾工
我父亲的年龄是:60
我父亲的私房钱有:20000

在该例子中,通过构造方法对对象属性进行初始化赋值。

PHP 不会在本类的构造方法中再自动的调用父类的构造方法。要执行父类的构造方法,需要在子类的构造方法中调用 parent::__construct()

二: 魔术方法之析构方法

1.概念: 对象被销毁时,被自动调用的方法

2.语法:

__destruct()

3.作用: 释放内存(释放资源)

PHP本身不操作内存,内存都是交给操作系统自动回收,所以PHP中的析构方法使用得很少; 

析构方法允许在销毁一个类之前执行的一些操作或完成一些功能,比如说关闭文件、释放结果集等,析构函数不能带有任何参数;

4.产生析构方法的方式:当脚本执行结束、对象销毁(unset())、对象被置空、对象指向其他变量;

<?php
class Father
{
	public $name;
	protected $age;
	private $money;
	/*析构方法析构方法允许在销毁一个类之前执行的一些操
	作或完成一些功能,比如说关闭文件、释放结果集等,析构函数不能带有任何参数*/
	public function __destruct()
	{
		echo "<br />我是析构方法,最后执行的,哈哈哈哈";
	}

	//构造方法必须是公共的,主要是给属性进行初始化赋值
	//定义一个构造方法对对象属性进行初始化赋值
	public function __construct($name,$age,$money)
	{
		$this->name=$name;
		$this->age=$age;
		$this->money=$money;
	}

	function say()
	{
		echo "我父亲的名字叫:".$this->name."<br />";
		echo "我父亲的年龄是:".$this->age."<br />";
		echo "我父亲的私房钱有:".$this->money;
	}
}

//实例化一个类
$f = new Father('曾工',60,20000); //类里面有构造方法时,必须加括号传参数
$f->say();

?>

效果:

我父亲的名字叫:曾工
我父亲的年龄是:60
我父亲的私房钱有:20000
我是析构方法,最后执行的,哈哈哈哈

三: 魔术方法之自动加载

1.手动加载: 在其他脚本中通过include /require进行引入,前提是该类必须存在;

2.自动加载: 在需要用到类的时候,系统会根据指定好的路径去找对应的类文件(文件名为基础),然后根据用户指定的操作,对文件进行处理(加载)。

3. __autoload():自动加载函数,所有的自动(魔术)都是提供了一个机制,能够被系统自动调用,但是内部的结构都是用户自己定义。

4.条件: 类名必须和文件的名字命名有关联  类名  类名.class.php  ;

5.eg:

同目录下类Student.class.php

<?php
   //定义学生类
class Student
{	
   public function study()
   {
      echo 'wo yao study study';
   }	
}

自动加载Student.class.php的文件Ajax.php

<?php
//类的自动加载
header("content-type:text/html;charset=utf-8");
/**
 * 手动加载类
 * include 'Person.class.php';
 * include 'Student.class.php';
 */

/**
 * 自动加载机制,框架中都是使用类的方式来实现功能,
 * 要想实现其中功能,必须事先把所有的类加载到内存中
 */
function __autoload($class)  //$class是类名
{
	if(file_exists("{$class}.class.php"))
	{
		include "{$class}.class.php";
	}
	elseif(file_exists("child/{$class}.class.php"))
	{
		include "child/{$class}.class.php";
	}
}

/*上述操作,只要类存在,就会被自动加载的内存中,前提条
件是类名和文件名是关联,类名和文件名的首个单词是一样*/

//实例化Student.class.php文件中的Student类,然后访问其方法
$student = new Student();
$student->study();

?>

效果:

wo yao study study

实现了自动加载Student.class.php文件里面的类Student,并且访问到了其方法;

四: 魔术方法之__toString()容错处理

1.概念:  __toString():指的是当对象需要被转换成字符串的时候,会自动调用的方法 

2.使用: 当我们需要直接echo 输出对象,又因为对象是复合数据类型,所以会报致命错误导致代码无法往下继续执行.使用这个方法,起到容错;

<?php
class Father
{	
	//当对象需要被转换成字符串,echo输出对象容错处理
	public function __toString()
	{
		return '$f'."是一个对象,不能直接输出";//必须通过return进行返回
	}
	public  $money=10000;	
}

$f = new Father();
echo $f;

效果:

$f是一个对象,不能直接输出

如果没有这个容错处理,效果:直接报错


Catchable fatal error: Object of class Father
 could not be converted to string in 
D:\wwwroot\test\Ajax.php on line 13

五: 魔术方法之__clone

1.概念:  __clone():克隆对象的时候,被克隆出来的对象会自动去调用的方法;

2.eg:

<?php
class Father
{
	//克隆对象时自动触发的方法
	public function __clone()
	{
		echo "我被克隆了,请放过我,不要模仿我";
	}	
	public  $money=10000;	
}

$f = new Father();
/**
 * 如果内部定义了魔术方法__clone时,定义的访问限定修饰符为
 * 非公有时,克隆代码出错,不能克隆新的对象
 */
$f1 = clone $f;
echo "<br />";
var_dump($f,$f1);

效果:

我被克隆了,请放过我,不要模仿我
object(Father)#1 (1) { ["money"]=> int(10000) } object(Father)#2 (1) { ["money"]=> int(10000) }

六: __sleep()

 休眠,当对象变得不再活跃时(序列化)时,自动触发的方法,主要用来保存我们需要写进文件中的属性。

 要求资源不被序列化。

七: __wakeup()

唤醒,当需要重新使用对象(unserialize),自动触发的方法。进行唤醒连接资源的方法,比如重新连接数据库;

猜你喜欢

转载自blog.csdn.net/weixin_41887155/article/details/86235658