• 微信号
目录

php基础

您当前的位置:首页 > 我的笔记 > php基础>自动加载和魔术方法

自动加载和魔术方法

自动加载

1.使用__autoload魔术函数

在php开发中,如果希望从外部引入一个class,通常会使用include和require方法,把定义这个class的文件包含进行。但是,在大型项目开发中,这会出现大量的require或者include方法的调用,这样不仅会降低效率,而且使代码维护困难。如果不小心忘记引入某个类的定义文件,会导致程序崩溃

为解决以上问题,php提供了类自动加载机制,即定义一个__autoload()函数,它会在试图使用未被定义的类时自动调用。这样在php报告错误之前会有最后一个机会加载所需的类。

案例

首先,在当前目录下,定位类定义文件Person.class.php文件

<?php
class Person {
private $name;
private $age;
function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
function say() {
echo "我的名字叫:".$this->name."<br />";
echo " 我的年龄是:".$this->age;
}
}
?>

需要注意的是,对于类定义文件通常使用类名.class.php这种形式命名,这样便于程序编写

test.php

<?php
function __autoload($class_name)
{
require_once $class_name.'.class.php';
}
//当前页面 Pserson 类不存在则自动调用 __autoload() 方法,传入参数 Person
$p1 = new Person("张三","20");
$p1 -> say();
?>

test.php运行结果

陵小宇博客-php自动加载类

需要注意的是,自动加载是指但需要类定义文件而没有找到时,会自动调用__autoload()函数,它不限于实例化对象,还包括继承、序列化等操作。而且,自动加载并不能自己完成加载类功能,它只会提供一个时机,具体加载代码还需要用户编写代码实现

2.使用spl_autoload_register函数

除__autoload()函数之外,spl_autoload_registeer()提供了一个更加灵活的方式来实现自动加载。

案例

<?php
function people($class_name){
	require $class_name.'.class.php';
}
spl_autoload_register('people');
$p1 = new Person("张三","20");
$p1 -> say();
?>

运行结果

陵小宇博客-php自动加载类

魔术方法

php中有很多以两个下划线为开头的方法,如,__construct()、__autoload()、__get()、__set()等,这些方法被称为魔术方法

魔术方法有一个特点就是不需要手动调用,在某一个时刻会自动执行,给程序开带来几大便利

常用的魔术方法

方法声明 功能描述
__sleep() 对象序列化之前被调用,使程序延缓一段时间执行
__wakeup() 对象反序列时被调用,还原被序列化的对象
__toString() 输出一个对象时被调用,将对象转化为字符串
__call() 在对象中调用一个不可以访问方法时会被调用
__callStatic() 用静态方式中调用一个不可访问方法时被调用
__cone() 克隆对象时被调用
__invoke() 但尝试调用函数的方式调用一个对象时被调用

案例:以__toString()为例

<?php
	class person{
		private $name ="张三";
		private $age =21;
		public function __toString(){
			return "$this->name ($this->age)";
		}
	}
	$p=new person();
	echo $p;
?>

运行结果

陵小宇博客-魔术方法-__toString()