PHP魔术函数和魔术常量

本文详细介绍了PHP中的魔术方法,包括构造函数__construct、析构函数__destruct等共计13种方法,以及__LINE__等5种魔术常量,并通过实例演示了这些方法的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

魔术函数

  1、__construct()
  实例化对象时被调用。
  当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用。

  2、__destruct()
  当删除一个对象或对象操作终止时被调用。

  3、__call()
  对象调用某个方法。
  若方法存在,则直接调用。 
  若不存在,则会去调用__call函数。

  4、__get()
  读取一个对象的属性时。
  若属性存在,则直接返回属性值。
  若不存在,则会调用__get函数。

  5、__set()
  设置一个对象的属性时。
  若属性存在,则直接赋值。
  若不存在,则会调用__set函数。

  6、__toString()
打印一个对象的时被调用。如echo $obj;或print $obj;

注意:这时候php会抛出一个Catchable fatal error错误,还有一点要注意,用print_r打印对象不会触发此函数



  7。__clone()
  克隆对象时被调用。如:$t=new Test();$t1=clone $t;

  8、__sleep()
  serialize之前被调用。若对象比较大,想删减一点东东再序列化,可考虑一下此函数。

  9、__wakeup()
  unserialize时被调用,做些对象的初始化工作。

  10、__isset()
  检测一个对象的属性是否存在时被调用。如:isset($c->name)。

如果name不存在,则触发该函数


  11、__unset()
  unset一个对象的属性时被调用。如:unset($c->name)。

如果name不存在,则触发该函数


  12。__set_state()
  调用var_export时,被调用。用__set_state的返回值做为var_export的返回值。

  13、__autoload()
这个函数比较特殊,这个函数并不是作为类的成员方法是用的。

  实例化一个对象时,如果对应的类不存在,则该方法被调用。

可以用spl_autoload_register函数来定义其他的函数来代替__autoload


魔术常量

  1、__LINE__
  返回文件中的当前行号。

  2、__FILE__
  返回文件的完整路径和文件名。如果用在包含文件中,则返回包含文件名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径,而在此之前的版本有时会包含一个相对路径。

  3、__FUNCTION__
  返回函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

  4、__CLASS__
  返回类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

  5、__METHOD__
  返回类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。


测试例子

<?php

class Magic {
	public $a = '';
	public $c = '';
	
	/**
	 * 函数名与类名相同,可代替构造函数的作用,在类初始化的时候我被调用
	 */
	public function Magic() {
		echo __FUNCTION__ . "<br />";
	}
	
	/**
	 * 构造函数
	 * 在类的初始化的时候我被调用
	 * 当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用。
	 */
	public function __construct() {
		echo __FUNCTION__ . "<br />";
	}
	
	
	/**
	 * 析构函数
	 * 当删除一个对象或对象操作终止时候调用
	 */
	public function __destruct() {
		echo __FUNCTION__ . "<br />";
	}
	
	/**
	 * 当调用对象不存在的方法时,我被触发
	 * @param varchar $method 调用的方法名
	 * @param array $args 传递的参数
	 */
	public function __call($method, $args) {
		echo "$method be called with args:";
		print_r($args);
	}
	
	/**
	 * 读取一个对象的属性时,如果该属性不存在,我被触发
	 * @param varchar $attr 所get的属性名
	 */
	public function __get($attr) {
		echo $attr . " has been get!";
	}
	
	/**
	 * 设置一个对象的属性的值的时候,若属性存在,直接赋值,若不存在,我被触发
	 * @param varchar $attr 所set的变量名
	 * @param  		  $value 所set的变量值 
	 */
	public function __set($attr, $value) {
		echo $attr . " has been to value:";
		print_r($value);
	}
	
	/**
	 * 打印一个对象时,我被调用
	 *  注意:这时候php会抛出一个Catchable fatal error错误,还有一点要注意,用print_r打印对象不会触发此函数
	 */
	public function __toString() {
		echo __FUNCTION__;
	}
	
	/**
	 * 对象被克隆的时候调用我
	 */
	public function __clone() {
		echo __FUNCTION__;
	}
	
	/**
	 * 对象在serialize之前被调用。若对象比较大,想删减一点东东再序列化,可考虑一下此函数。
	 */
	 public function __sleep() {
	 	echo __FUNCTION__;
	 }
	 
	 /**
	  * unserialize时被调用,做些对象的初始化工作。
	  */
	 public function __wakeup() {
	 	echo __FUNCTION__;
	 }
	
	/**
	 * 检测一个对象的属性是否存在时被调用
	 * 如果属性存在,不调用
	 * 如果不存在,调用
	 * @param varchar $attr 检测的对象的名称
	 */
	 public function __isset($attr) {
	 	echo $attr . " is checked by isset function";
	 }
	 
	 /**
	  * unset一个对象的属性时被调用
	  */
	 public function __unset($attr) {
	 		echo $attr . " has been unset";
	 }
	 
	 /**
	  * 调用var_export时,被调用。用__set_state的返回值做为var_export的返回值。
	  */
	 public function __set_state() {
	 	echo __FUNCTION__;
		return 123;
	 }
	
}
// test __construct
$magic = new Magic;
// __construct 被触发,输出__construct

// test __call
$magic->haha(1,2,3);
// __call 被触发
// 输出 haha be called with args:Array ( [0] => 1 [1] => 2 [2] => 3 ) 

// test __get
$magic->a;
$magic->b;
// 输出  b has been get!

// test __set
$magic->b = array(1,2,3);
// 输出 b has been to value:123

// test __toString
//print $magic;		// 测试时请去掉注释
// 输出 __toSting
// 同时给出一个报错:Catchable fatal error: Method Magic::__toString() must return a string value in E:\eclipse\workspace\test\magic_test.php on line 87

// test __clone
//$new_magin = clone $magic;
// 输出 __clone

// test __isset
isset($magic->a);
// 无输出
isset($magic->b);
// b is checked by isset function

// test __unset
unset($magic->a);
// 无输出
unset($magic->b);
// 输出  b has been unset

echo '<br />';

function __autoload($class_name) {
	echo __FUNCTION__;
}
$test_auto = new test_auto;
// 输出 __autoload

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值