魔术常量
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 新加)。返回该方法被定义时的名字(区分大小写)。 什么是魔术函数? 对于开头的函数就命名为魔术函数, 此类函数都在特定的条件下触发的.比如: set() get()等 在设置或取不存在的属性时候触发. 有那些魔术函数呢? 总的来说, 有下面几个魔术函数 construct() destruct() get() set() isset() unset() call() call() sleep() wakeup() to() set_state() clone() autoload() construct()当实例化一个对象的时候,这个对象的这个方法首先被调用。 destruct()当删除一个对象或对象操作终止的时候,调用该方法。 class test1 {
public function construct() {
var_dump(function);
}
public function destruct() {
var_dump(function);
}
}
$t1 = new test1 ;
unset($t1);get当试图读取一个并不存在的属性的时候被调用。 set当试图向一个并不存在的属性写入值的时候被调用。 isset当试图检测一个并不存在的属性时候被调用。 unset当试图取消一个并不存在的属性时候被调用。 class test2 {
public $name3;
public function set($key, $value) {
var_dump(function. '
KEY:'
.$key.'
Value:'
.$value);
}
public function get($key) {
var_dump(function. 'KEY:'.$key);
}
public function isset($key) {
var_dump(function. ' KEY:'.$key);
}
public function unset($key) {
var_dump(function. ' KEY:'.$key);
}
}
$t =new test2 ;
$t->name = "steven";
$t->name2;
$t->name3;
isset($t->name2);
isset($t->name3);
unset($t->name4);sleep当进行序列化对象时候调用 wakeup当进行反序列对象时候调用 需要注意一点: 1. sleep()必须返回一个数组或者对象(一般返回的是$this),返回的值将会被用来做为序列化的 值。 如果不返回这个值,则序列化失败。这也意味着反序列化将不会触发wakeup事件。 2. 序列化会保存默认赋值的属性.如果要通过实例化赋值的内容,则需要属性在sleep()返回数组的 指定. 如$id与$id2的区别. class test3 {
public $name = "steven";
public $id = "1"; public $id2;
public function sleep() {
var_dump(function); // 序列化不成功.没有返回值.反序列也失败 //
return array("name"); // 序列化成功.有返回值.反序列成功.id2属性能被恢复 //
return array("name", "id2");// 序列化成功.有返回值.反序列成功.id2属性不能被恢复
return array("name"); }
public function testEcho() {
var_dump($this->name);
var_dump($this->id);
var_dump($this->id2);
}
public function wakeup() {
var_dump(function);
$this->testEcho();
}
}
$t3= new test3 ;
$t3->id2 = uniqid();
$t3s = serialize($t3);
unserialize($t3s);toString当直接打印一个对象的时候,这个方法将会被调用 class test4 {
public function toString() {
return "toString";
}
}
$t4 = new test4();
echo $t4;
print $t4;
var_dump($t4);
print_r($t4); call($func, $param) 当尝试调用一个不存在的方法的时候被调用. 这个方法必须有两个参数,第一个为调用的方法名,第二个是一个被调用方法的参数数组。 需要注意的是,当你在一个子类调用父类的private的方法,或者在实例里调用类的非protect方法的 时候,并不会调用call()
class test5 {
public function call($func, $param) {
var_dump('Function:'.$func);
var_dump($param);
}
}
$t5 = new test5;
$t5->echoTest('xx','xx','xx'); callStatic()当尝试调用一个不存在的方法的时候被调用 这个方法必须有两个参数,第一个为调用的方法名,第二个是一个被调用方法的参数数组。 在PHP5.3中出现
class test51 {
public function callStatic($fun, $param) {
var_dump('Function:'.$func);
var_dump($param);
}
}
test51::test('xx','xx','xx');set_state()当用var_export导出实例的时候被调用.此方法有一个参数,为包含所导出的实例的所 有成员属性的一个数组 class test6 {
public function set_state($arr){
var_dump($arr);
}
}
$t6 = new test6;
$t6->age = "12";
var_export($t6, true);
var_export($t6);
eval('
$b='
.var_export($t6,true).';');
print_r($b);clone()当克隆实例时候被调用. 注意: 1.在php5里,对象间的赋值总是以地址引用来传递的. 2.如果要以实际值来传递,则需要用到clone关键词 3.clone的只是实例。如果实例中的某个成员属性也是个实例,那么这个成员属性还是会以引用方法被 传递到新的实例。 // 对象间的赋值总是以地址引用来传递的. $t71 $t72的age属性是一样的. class test71 {
public $age = 10;
}
$t71 = new test71();
$t72 = $t71 ;
var_dump($t71->age) ;
$t71->age =12 ;
var_dump($t71->age) ;
var_dump($t72->age) ; // 如果要以实际值来传递,则需要用到clone关键词 $t73 = clone $t71; $t71->age = 13 ; var_dump($t71->age) ;
var_dump($t73->age) ; // 如果实例中的某个成员属性也是个实例,那么这个成员属性还是会以引用方法被传递到新的实例。autoload()函数.当创建一个实例化的时候,如果对应的类不存在,则会被调用 function autoload($class) {
if ( $class == "test8" ){
require_once
dirname
(FILE).'/class8.php';
}
}
spl_autoload();
$t8 = new test8;
var_dump($t8->age); |