目录
魔术方法
魔术方法的概念: 以两个_ _开头,在类的内部定义,在某种特定的情况下被对象自动调用的方法;
魔术函数是PHP中内置的语言特性,当程序执行到某种情况时,如果定义了这些魔术函数,则PHP会调用他们,同时也会传入相应的参数,可以认为是PHP执行过程中的钩子函数。常见的魔术函数有__construct, __destruct , __call, __get, __set, __isset, __unset ,__sleep, __wakeup, __toString, __clone 以及__autoload 。它们可以用来自动加载包含文件,实现延迟执行(类似于.Net中的属性访问器)、垃圾回收、对象clone 等操作;
一: 魔术方法之构造方法
1.概念: 对象在实例化后会自动调用的方法;
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),自动触发的方法。进行唤醒连接资源的方法,比如重新连接数据库;