PHP几种常见魔术方法与魔术变量解析
先不多说,直接上代码,如下:
1 class Demo
2 {
3 private $str = 'str';
4
5 //实例化时自动加载function
6 public function __construct()
7 {
8 echo "start<br/>";
9 }
10
11 //__call()用来获取没有定义的function
12 public function __call($name, $arguments)
13 {
14 echo $name.'_call<br>';
15 }
16
17 //获取私有变量
18 public function __get($name)
19 {
20 // TODO: Implement __get() method.
21 echo $this->$name.'_get<br/>';
22 }
23
24 //通过关键字 clone 克隆一个对象时该对象调用__clone()方法
25 public function __clone()
26 {
27 // TODO: Implement __clone() method.
28 }
29
30 //__set()设置私有变量的值
31 public function __set($name, $value)
32 {
33 // TODO: Implement __set() method.
34 $this->$name = $value;
35 }
36
37 //————callStatic()调用没有被定义的static静态function
38 public static function __callStatic($name, $arguments)
39 {
40 // TODO: Implement __callStatic() method.
41 echo $name.'_classStatic';
42 }
43
44 //删除类对象时候自动调用
45 public function __destruct()
46 {
47 // TODO: Implement __destruct() method.
48 echo "end";
49 }
50
51
52 }
53
54 $class = new Demo();
55 $class->success();
56 $class->succ = 111;
57 echo $class->succ;
58 echo $class->str;
59 echo '<br>';
60 $obj = clone $class;
61 print_r($obj);
62 echo '<br>';
63 $class::end();
运行结果:
start
success_call
111str_get
clone
Demo Object ( [str:Demo:private] => str [succ] => 111 )
end_classStatic
endend
方法总结:
1. __set(),__get(),__isset(),__unset()可以归之为一类,适用于私有变量的设置、取值、判断、删除的操作。
2. __construct()构造函数,__desctruct()析构函数,实例化类的时候就会产生,有一点不同,构造在最前面,
析构函数在最后面
3. 当调用class中没有定义的方法时,会报错fail error,如果class中定义了__call(),会直接调用__call()方法进行操作。
例如:$class->success('data');类中的__call方法开始执行把参数转换为数组形式array([0] => 'data');
__callStatic()方法同理,只是对没有定义的静态方法起作用。
几种常见的魔术变量:
1 namespace app;
2
3 //__LINE__ 当前脚本行号
4 echo __LINE__.'<br/>';
5
6 //__FILE__ 文件的完整路径与文件名
7 echo __FILE__.'<br/>';
8
9 //__DIR__ 文件所在目录
10 echo __DIR__.'<br/>';
11
12 class Test {
13 function demo(){
14 //__FUNCTION__ 函数名称 ,php5以后返回该函数被定义时的名字(区分大小写)
15 echo __FUNCTION__.'<br/>';
16
17 //__CLASS__ 类名称,PHP 5 起本常量返回该类被定义时的名字(区分大小写)。
18 //注意自 PHP 5.4 起 __CLASS__ 对 trait 也起作用。
19 //当用在 trait 方法中时,__CLASS__ 是调用 trait 方法的类的名字。
20 echo __CLASS__.'<br/>';
21
22 //__METHOD__ 类的方法名,返回该方法被定义时的名字(区分大小写)
23 echo __METHOD__.'<br/>';
24
25
26 //__NAMESPACE__ 当前命名空间
27 echo __NAMESPACE__.'<br/>';
28 }
29 }
30
31 (new Test())->demo();
32
33 trait HelloWorld {
34 public function sayHello() {
35 //__TRAIT__ Trait 的名字 PHP 5.4 起此常量返回 trait 被定义时的名字(区分大小写)
36 echo __TRAIT__.'<br/>';
37 }
38 }
39
40 class TheWorldIsNotEnough {
41 use HelloWorld;
42 }
43 $o = new TheWorldIsNotEnough();
44 $o->sayHello();
输出结果:
12
G:\phpstudy\PHPTutorial\WWW\phpDemo\03-08.php
G:\phpstudy\PHPTutorial\WWW\phpDemo
demo
app\Test
app\Test::demo
app
app\HelloWorld
原文地址: http://small.aiweimeng.top/index.php/archives/49.html