欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PHP几种常见魔术方法与魔术变量解析

程序员文章站 2022-06-10 17:15:58
1. __set(),__get(),__isset(),__unset()可以归之为一类,适用于私有变量的设置、取值、判断、删除的操作。 2. __construct()构造函数,__desctruct()析构函数,实例化类的时候就会产生,有一点不同,构造在最前面, 析构函数在最后面 3. 当调用... ......

原文地址:

先不多说,直接上代码,如下:

 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