魔术函数
1、__construct()
实例化对象时被调用。
当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用。
2、__destruct()
当删除一个对象或对象操作终止时被调用。
3、__call()
对象调用某个方法。
若方法存在,则直接调用。
若不存在,则会去调用__call函数。
4、__get()
读取一个对象的属性时。
若属性存在,则直接返回属性值。
若不存在,则会调用__get函数。
5、__set()
设置一个对象的属性时。
若属性存在,则直接赋值。
若不存在,则会调用__set函数。
6、__toString()
打印一个对象的时被调用。如echo $obj;或print $obj;
7。__clone()
克隆对象时被调用。如:$t=new Test();$t1=clone $t;
8、__sleep()
serialize之前被调用。若对象比较大,想删减一点东东再序列化,可考虑一下此函数。
9、__wakeup()
unserialize时被调用,做些对象的初始化工作。
10、__isset()
检测一个对象的属性是否存在时被调用。如:isset($c->name)。
11、__unset()
unset一个对象的属性时被调用。如:unset($c->name)。
12。__set_state()
调用var_export时,被调用。用__set_state的返回值做为var_export的返回值。
13、__autoload()
这个函数比较特殊,这个函数并不是作为类的成员方法是用的。
返回文件中的当前行号。
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 新加)。返回该方法被定义时的名字(区分大小写)。
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