찾다
백엔드 개발PHP 튜토리얼PHP反射API,反射api_PHP教程

PHP反射API,反射api

  近期忙着写项目,没有学习什么特别新的东西,所以好长时间没有更新博客。我们的项目用的是lumen,是基于laravel的一个轻量级框架,我看到里面用到了一些反射API机制来帮助动态加载需要的类、判断方法等,所以本篇文章就把在PHP中经常用到的反射API给大家分享一下吧,想学习反射API的同学可以看看。

  说起反射ApI,自我感觉PHP中的反射ApI和java中的java.lang.reflect包差不多,都是由可以打印和分析类成员属性、方法的一组内置类组成的。可能你已经学习过对象函数比如:get_class_vars()但是使用反射API会更加的灵活、输出信息会更加详细。

  首先我们需要知道,反射API不仅仅是用来检查类的,它本身包括一组类,用来完成各种功能:常用的类如下:

Reflection类 可以打印类的基本信息,(通过提供的静态export()函数)
ReflectionMethod类 见名知意,打印类方法、得到方法的具体信息等
ReflectionClass类 用于得到类信息,比如得到类包含的方法,类本的属性,是不是抽象类等
ReflectionParameter类 显示参数的信息,可以动态得到已知方法的传参情况
ReflectionException类  用于显示错误信息
ReflectionExtension类 得到PHP的扩展信息,可以判断扩展是否存在等

 

 

 

 

 

 

 

 

传统的打印类信息与反射APi的区别
下面是一段我自己写的参数程序,用于演示反射的使用:

<span> 1</span> <?<span>php
</span><span> 2</span> 
<span> 3</span> <span>class</span><span> Person
</span><span> 4</span> <span>{
</span><span> 5</span>     <span>//</span><span>成员属性</span>
<span> 6</span>     <span>public</span> <span>$name</span><span>;
</span><span> 7</span>     <span>public</span> <span>$age</span><span>; 
</span><span> 8</span> 
<span> 9</span>     <span>//</span><span>构造方法</span>
<span>10</span>     <span>public</span> <span>function</span> __construct(<span>$name</span>, <span>$age</span><span>)
</span><span>11</span> <span>    {
</span><span>12</span>         <span>$this</span>->name = <span>$name</span><span>;
</span><span>13</span>         <span>$this</span>->age = <span>$age</span><span>;
</span><span>14</span> <span>    }
</span><span>15</span> 
<span>16</span>     <span>//</span><span>成员方法</span>
<span>17</span>     <span>public</span> <span>function</span> set_name(<span>$name</span><span>)
</span><span>18</span> <span>    {
</span><span>19</span>         <span>$this</span>-><span>$name</span> = <span>$name</span><span>;
</span><span>20</span> <span>    }
</span><span>21</span> 
<span>22</span>     <span>public</span> <span>function</span><span> get_name()
</span><span>23</span> <span>    {
</span><span>24</span>         <span>return</span> <span>$this</span>-><span>$name</span><span>;
</span><span>25</span> <span>    }
</span><span>26</span> 
<span>27</span>     <span>public</span> <span>function</span><span> get_age()
</span><span>28</span> <span>    {
</span><span>29</span>         <span>return</span> <span>$this</span>-><span>$age</span><span>;
</span><span>30</span> <span>    }
</span><span>31</span> 
<span>32</span>     <span>public</span> <span>function</span><span> get_user_info()
</span><span>33</span> <span>    {
</span><span>34</span>         <span>$info</span> = '姓名:' . <span>$this</span>-><span>name;
</span><span>35</span>         <span>$info</span> .= ' 年龄:' . <span>$this</span>-><span>age;
</span><span>36</span>         <span>return</span> <span>$info</span><span>;
</span><span>37</span> <span>    }
</span><span>38</span> <span>}
</span><span>39</span> 
<span>40</span> <span>class</span> Teacher <span>extends</span><span> Person
</span><span>41</span> <span>{
</span><span>42</span>     <span>private</span> <span>$salary</span> = 0<span>;
</span><span>43</span> 
<span>44</span>     <span>public</span> <span>function</span> __construct(<span>$name</span>, <span>$age</span>, <span>$salary</span><span>)
</span><span>45</span> <span>    {
</span><span>46</span>         parent::__construct(<span>$name</span>, <span>$age</span><span>);
</span><span>47</span>         <span>$this</span>->salary = <span>$salary</span><span>;
</span><span>48</span> <span>    }
</span><span>49</span> 
<span>50</span>     <span>public</span> <span>function</span><span> get_salary()
</span><span>51</span> <span>    {
</span><span>52</span>         <span>return</span> <span>$this</span>-><span>$salary</span><span>;
</span><span>53</span> <span>    }
</span><span>54</span> 
<span>55</span>     <span>public</span> <span>function</span><span> get_user_info()
</span><span>56</span> <span>    {
</span><span>57</span>         <span>$info</span> = parent::<span>get_user_info();
</span><span>58</span>         <span>$info</span> .= " 工资:" . <span>$this</span>-><span>salary;
</span><span>59</span>         <span>return</span> <span>$info</span><span>;
</span><span>60</span> <span>    }
</span><span>61</span> <span>}
</span><span>62</span> 
<span>63</span> <span>class</span> Student <span>extends</span><span> Person
</span><span>64</span> <span>{
</span><span>65</span>     <span>private</span> <span>$score</span> = 0<span>;
</span><span>66</span> 
<span>67</span>     <span>public</span> <span>function</span> __construct(<span>$name</span>, <span>$age</span>, <span>$score</span><span>)
</span><span>68</span> <span>    {
</span><span>69</span>         parent::__construct(<span>$name</span>, <span>$age</span><span>);
</span><span>70</span>         <span>$this</span>->score = <span>$score</span><span>;
</span><span>71</span> <span>    }
</span><span>72</span> 
<span>73</span>     <span>public</span> <span>function</span><span> get_score()
</span><span>74</span> <span>    {
</span><span>75</span>         <span>return</span> <span>$this</span>-><span>score;        
</span><span>76</span> <span>    }
</span><span>77</span> 
<span>78</span>     <span>public</span> <span>function</span><span> get_user_info()
</span><span>79</span> <span>    {
</span><span>80</span>         <span>$info</span> = parent::<span>get_user_info();
</span><span>81</span>         <span>$info</span> .= " 成绩:" . <span>$this</span>-><span>score;
</span><span>82</span>         <span>return</span> <span>$info</span><span>;
</span><span>83</span> <span>    }
</span><span>84</span> <span>}
</span><span>85</span> 
<span>86</span> <span>header</span>("Content-type:text/html;charset=utf8;"<span>);
</span><span>87</span> <span>$te_obj</span> = <span>new</span> Teacher('李老师', '36', '2000'<span>);
</span><span>88</span> <span>$te_info</span> = <span>$te_obj</span>-><span>get_user_info();
</span><span>89</span> 
<span>90</span> <span>$st_obj</span> = <span>new</span> Student('小明', '13', '80'<span>);
</span><span>91</span> <span>$st_info</span> = <span>$st_obj</span>->get_user_info();

我们先用var_dump();打印类的信息,如下所示,可以看出只是打印出类的简单信息,甚至连方法也没有,所以从这样的信息中看不出其他游泳的信息。

var_dump($te_obj);

<span>1</span> <span>object</span>(Teacher)<span>#</span><span>1 (3) {</span>
<span>2</span>       ["salary":"Teacher":<span>private</span>]=>
<span>3</span>           <span>string</span>(4) "2000"
<span>4</span>       ["name"]=>
<span>5</span>           <span>string</span>(9) "李老师"
<span>6</span>       ["age"]=>
<span>7</span>           <span>string</span>(2) "36"
<span>8</span> }

  Reflection::export($obj);

  我们利用Reflection提供的内置方法export来打印信息,如下所示:

  打印出的信息比较完整,包括成员属性,成员方法,类的基本信息,文件路径,方法信息,方法属性,传参情况,所在文件的行数等等。比较全面的展示了类的信息。可以看出var_dump()或者print_r只能显示类的简要信息,好多信息根本显示不出来,所以他们只能做简单的调试之用,反射Api则提供的类更多的信息,可以很好地帮助我们知道调用类的情况,这对写接口,特别是调用别人的接口提供了极大的便利。如果出了问题,也可以帮助调试。

<span> 1</span> <span>object</span>(Teacher)<span>#</span><span>1 (3) {</span>
<span> 2</span>       ["salary":"Teacher":<span>private</span>]=>
<span> 3</span>           <span>string</span>(4) "2000"
<span> 4</span>       ["name"]=>
<span> 5</span>           <span>string</span>(9) "李老师"
<span> 6</span>       ["age"]=>
<span> 7</span>           <span>string</span>(2) "36"
<span> 8</span> <span>}
</span><span> 9</span> <span>Class</span> [  <span>class</span><span> Person ] {
</span><span>10</span>       @@ /usr/local/www/phptest/oop/reflaction.php 3-38
<span>11</span>       - Constants [0<span>] {
</span><span>12</span> <span>      }
</span><span>13</span>       - <span>Static</span> properties [0<span>] {
</span><span>14</span> <span>      }
</span><span>15</span>       - <span>Static</span> methods [0<span>] {
</span><span>16</span> <span> }
</span><span>17</span>   - Properties [2<span>] {
</span><span>18</span>         Property [  <span>public</span> <span>$name</span><span> ]
</span><span>19</span>         Property [  <span>public</span> <span>$age</span><span> ]
</span><span>20</span> <span>  }
</span><span>21</span> 
<span>22</span>   - Methods [5<span>] {
</span><span>23</span>     Method [  <span>public</span><span> method __construct ] {
</span><span>24</span>       @@ /usr/local/www/phptest/oop/reflaction.php 10 - 14
<span>25</span> 
<span>26</span>       - Parameters [2<span>] {
</span><span>27</span>         Parameter <span>#</span><span>0 [  $name ]</span>
<br />.....                

反射API的具体使用:

  看过框架源码的同学都知道框架都可以加载第三方的插件、类库等等。下面这个例子咱们借助反射APi简单实现这个功能,该例子原型是我从书上学习的,我理解后按照自己的思路写了一套:要实现的功能:用一个类去动态的遍历调用Property类对象,类可以自由的加载其他的类的方法,而不用吧类嵌入到已有的代码,也不用手动去调用类库的代码。
    约定:每一个类要包含work方法,可以抽象出一个接口。可以把每个类的信息放在文件中,相当于各个类库信息,通过类保存的Property类库的对应对象,然后调用每个类库的work方法。

  下面是基础代码:

<span> 1</span> <span>/*</span><span>属性接口</span><span>*/</span>
<span> 2</span> <span>interface</span><span> Property
</span><span> 3</span> <span>{
</span><span> 4</span>     <span>function</span><span> work();
</span><span> 5</span> <span>}
</span><span> 6</span> 
<span> 7</span> <span>class</span><span> Person
</span><span> 8</span> <span>{
</span><span> 9</span>     <span>public</span> <span>$name</span><span>;
</span><span>10</span>     <span>public</span> <span>function</span> __construct(<span>$name</span><span>)
</span><span>11</span> <span>    {
</span><span>12</span>         <span>$this</span>->name = <span>$name</span><span>;
</span><span>13</span> <span>    }
</span><span>14</span> <span>}
</span><span>15</span> 
<span>16</span> <span>class</span> StudentController <span>implements</span><span> Property
</span><span>17</span> <span>{
</span><span>18</span>     <span>//</span><span>set方法,但需要Person对象参数</span>
<span>19</span>     <span>public</span> <span>function</span> setPerson(Person <span>$obj_person</span><span>)
</span><span>20</span> <span>    {
</span><span>21</span>         <span>echo</span> 'Student ' . <span>$obj_person</span>-><span>name;
</span><span>22</span> <span>    }
</span><span>23</span> 
<span>24</span>     <span>//</span><span>work方法简单实现</span>
<span>25</span>     <span>public</span> <span>function</span><span> work()
</span><span>26</span> <span>    {
</span><span>27</span>         <span>echo</span> 'student working!'<span>;
</span><span>28</span> <span>    }
</span><span>29</span> <span>}
</span><span>30</span> 
<span>31</span> <span>class</span> EngineController <span>implements</span><span> Property
</span><span>32</span> <span>{
</span><span>33</span>     <span>//</span><span>set方法</span>
<span>34</span>     <span>public</span> <span>function</span> setWeight(<span>$weight</span><span>)
</span><span>35</span> <span>    {
</span><span>36</span>         <span>echo</span> 'this is engine -> set weight'<span>;
</span><span>37</span> <span>    }
</span><span>38</span> 
<span>39</span>     <span>public</span> <span>function</span> setPrice(<span>$price</span><span>)
</span><span>40</span> <span>    {
</span><span>41</span>         <span>echo</span> "this is engine -> set price"<span>;
</span><span>42</span> <span>    }
</span><span>43</span> 
<span>44</span>     <span>//</span><span>work方法简单实现</span>
<span>45</span>     <span>public</span> <span>function</span><span> work()
</span><span>46</span> <span>    {
</span><span>47</span>         <span>echo</span> 'engine working!'<span>;
</span><span>48</span> <span>    }
</span><span>49</span> }

    这里定义了两个相似类实现Property接口,同时都简单实现work()方法 StudentController类稍微不同,参数需要Person对象,同时我们可以使用文件来保存各个类的信息,我们也可以用成员属性代替。

<span> 1</span> <span>class</span><span> Run
</span><span> 2</span> <span>{
</span><span> 3</span>     <span>public</span> <span>static</span> <span>$mod_arr</span> =<span> [];
</span><span> 4</span>     <span>public</span> <span>static</span> <span>$config</span> =<span> [
</span><span> 5</span>         'StudentController' =><span> [
</span><span> 6</span>             'person' => 'xiao ming'
<span> 7</span>         ],
<span> 8</span>         'EngineController'  =><span> [
</span><span> 9</span>             'weight' => '500kg',
<span>10</span>             'price'  => '4000'
<span>11</span> <span>        ]
</span><span>12</span> <span>    ];
</span><span>13</span> 
<span>14</span>     <span>//</span><span>加载初始化</span>
<span>15</span>     <span>public</span> <span>function</span><span> __construct()
</span><span>16</span> <span>    {
</span><span>17</span>         <span>$config</span> = self::<span>$config</span><span>;
</span><span>18</span>         <span>//</span><span>用于检查是不是实现类</span>
<span>19</span>         <span>$property</span> = <span>new</span> ReflectionClass('Property'<span>);
</span><span>20</span>         
<span>21</span>         <span>//
</span><span>22</span>         <span>foreach</span> (<span>$config</span> <span>as</span> <span>$class_name</span> => <span>$params</span><span>) 
</span><span>23</span> <span>        {
</span><span>24</span>             <span>$class_reflect</span> = <span>new</span> ReflectionClass(<span>$class_name</span><span>);
</span><span>25</span>             <span>if</span>(!<span>$class_reflect</span>->isSubclassOf(<span>$property</span><span>)) <span>//用isSubclassOf方法检查是否是这个对象
</span></span><span>26</span> <span>            {
</span><span>27</span>                 <span>echo</span> 'this is  error'<span>;
</span><span>28</span>                 <span>continue</span><span>;
</span><span>29</span> <span>            }
</span><span>30</span> 
<span>31</span>             <span>//</span><span>得到类的信息</span>
<span>32</span>             <span>$class_obj</span> = <span>$class_reflect</span>-><span>newInstance();
</span><span>33</span>             <span>$class_method</span> = <span>$class_reflect</span>-><span>getMethods();
</span><span>34</span> 
<span>35</span>             <span>foreach</span> (<span>$class_method</span> <span>as</span> <span>$method_name</span><span>) 
</span><span>36</span> <span>            {
</span><span>37</span>                 
<span>38</span>                 <span>$this</span>->handle_method(<span>$class_obj</span>, <span>$method_name</span>, <span>$params</span><span>);
</span><span>39</span> <span>            }
</span><span>40</span>             <span>array_push</span>(self::<span>$mod_arr</span>, <span>$class_obj</span><span>);
</span><span>41</span> <span>        }
</span><span>42</span> <span>    }
</span><span>43</span> 
<span>44</span>     <span>//</span><span>处理方法调用</span>
<span>45</span>     <span>public</span> <span>function</span> handle_method(Property <span>$class_obj</span>, ReflectionMethod <span>$method_name</span>, <span>$params</span><span>)
</span><span>46</span> <span>    {
</span><span>47</span>         <span>$m_name</span> = <span>$method_name</span>-><span>getName();
</span><span>48</span>         
<span>49</span>         <span>$args</span> = <span>$method_name</span>-><span>getParameters();
</span><span>50</span>         <span>if</span>(<span>count</span>(<span>$args</span>) != 1 || <span>substr</span>(<span>$m_name</span>, 0, 3) != 'set'<span>)
</span><span>51</span> <span>        {    
</span><span>52</span>             <span>return</span> <span>false</span><span>;
</span><span>53</span> <span>        }
</span><span>54</span>         <span>//大小写转换,做容错处理</span>
<span>55</span>         <span>$property</span> = <span>strtolower</span>(<span>substr</span>(<span>$m_name</span>, 3<span>));
</span><span>56</span>      
<span>57</span>         <span>if</span>(!<span>isset</span>(<span>$params</span>[<span>$property</span><span>]))
</span><span>58</span> <span>        {
</span><span>59</span>             <span>return</span> <span>false</span><span>;
</span><span>60</span> <span>        }
</span><span>61</span> 
<span>62</span>         <span>$args_class</span> = <span>$args</span>[0]-><span>getClass();
</span><span>63</span>         <span>echo</span> '<pre class="brush:php;toolbar:false">'<span>;
</span><span>64</span>         <span>if</span>(<span>empty</span>(<span>$args_class</span><span>))
</span><span>65</span> <span>        {
</span><span>66</span>             <span>$method_name</span>->invoke(<span>$class_obj</span>, <span>$params</span>[<span>$property</span><span>]); <span>//如果得到的类为空证明需要传递基础类型参数
</span></span><span>67</span>         } <span>else</span><span> {
</span><span>68</span>             <span>$method_name</span>->invoke(<span>$class_obj</span>, <span>$args_class</span>->newInstance(<span>$params</span>[<span>$property</span><span>])); <span>//如果不为空说明需要传递真实对象
</span></span><span>69</span> <span>        }
</span><span>70</span> <span>    }
</span><span>71</span> <span>}
</span><span>72</span> 
<span>73</span> <span>//程序开始
</span><span>74</span> <span>new</span> Run();

  到此程序结束,Run启动会自动调用构造方法,初始化要加载类库的其他成员属性,包括初始化和执行相应方法操作,这里只是完成了对应的set方法。其中$mod_arr属性保存了所有调用类的对象,每个对象包含数据,可以遍历包含的对象来以此调用work()方法。

  程序只做辅助理解反射PAI用,各个功能没有完善,里面用到了好多反射API的类,方法,下面会有各个方法的总结。

反射API提供的常用类和函数:

下面提供的函数是常用的函数,不是全部,有的函数根本用不到,所以我们有往撒谎那个写,想看全部的可以到网上搜一下,比较多。提供的这组方法没有必要背下来,用到的时候可以查看。

<span> 1</span> 1<span>:Reflection
</span><span> 2</span>   <span>public</span> <span>static</span> export(Reflector r [,bool <span>return</span>])<span>//</span><span>打印类或方法的详细信息</span>
<span> 3</span>   <span>public</span> <span>static</span>  getModifierNames(int modifiers)  <span>//</span><span>取得修饰符的名字</span>
<span> 4</span> 
<span> 5</span> 2<span>:ReflectionMethod:
</span><span> 6</span>     <span>public</span> <span>static</span> <span>string</span> export()                       <span>//</span><span>打印该方法的信息</span>
<span> 7</span>     <span>public</span> <span>mixed</span> invoke(stdclass <span>object</span>, <span>mixed</span>* args)   <span>//</span><span>调用对应的方法</span>
<span> 8</span>     <span>public</span> <span>mixed</span> invokeArgs(stdclass <span>object</span>, <span>array</span> args)<span>//</span><span>调用对应的方法,传多参数</span>
<span> 9</span>     <span>public</span> bool isFinal()        <span>//</span><span>方法是否为final</span>
<span>10</span>     <span>public</span> bool isAbstract()     <span>//</span><span>方法是否为abstract</span>
<span>11</span>     <span>public</span> bool isPublic()       <span>//</span><span>方法是否为public</span>
<span>12</span>     <span>public</span> bool isPrivate()      <span>//</span><span>方法是否为private</span>
<span>13</span>     <span>public</span> bool isProtected()    <span>//</span><span>方法是否为protected</span>
<span>14</span>     <span>public</span> bool isStatic()       <span>//</span><span>方法是否为static</span>
<span>15</span>     <span>public</span> bool isConstructor()  <span>//</span><span>方法是否为构造函数</span>
<span>16</span> 
<span>17</span> 
<span>18</span> 3<span>:ReflectionClass:
</span><span>19</span>     <span>public</span> <span>static</span> <span>string</span> export()  <span>//</span><span>打印类的详细信息</span>
<span>20</span>     <span>public</span> <span>string</span> getName()        <span>//</span><span>取得类名或接口名</span>
<span>21</span>     <span>public</span> bool isInternal()       <span>//</span><span>类是否为系统内部类</span>
<span>22</span>     <span>public</span> bool isUserDefined()    <span>//</span><span>类是否为用户自定义类</span>
<span>23</span>     <span>public</span> bool isInstantiable()   <span>//</span><span>类是否被实例化过</span>
<span>24</span>     <span>public</span> bool hasMethod(<span>string</span> name)  <span>//</span><span>类是否有特定的方法</span>
<span>25</span>     <span>public</span> bool hasProperty(<span>string</span> name)<span>//</span><span>类是否有特定的属性</span>
<span>26</span>     <span>public</span> <span>string</span> getFileName()         <span>//</span><span>获取定义该类的文件名,包括路径名</span>
<span>27</span>     <span>public</span> int getStartLine()           <span>//</span><span>获取定义该类的开始行</span>
<span>28</span>     <span>public</span> int getEndLine()             <span>//</span><span>获取定义该类的结束行</span>
<span>29</span>     <span>public</span> <span>string</span> getDocComment()       <span>//</span><span>获取该类的注释</span>
<span>30</span>     <span>public</span> ReflectionMethod getConstructor()           <span>//</span><span>取得该类的构造函数信息</span>
<span>31</span>     <span>public</span> ReflectionMethod getMethod(<span>string</span> name)    <span> //</span><span>取得该类的某个特定的方法信息</span>
<span>32</span>     <span>public</span> ReflectionMethod[] getMethods()             <span>//</span><span>取得该类的所有的方法信息</span>
<span>33</span>     <span>public</span> ReflectionProperty getProperty(<span>string</span> name) <span>//</span><span>取得某个特定的属性信息</span>
<span>34</span>     <span>public</span> ReflectionProperty[] getProperties()        <span>//</span><span>取得该类的所有属性信息</span>
<span>35</span>     <span>public</span> <span>array</span> getConstants()                         <span>//</span><span>取得该类所有常量信息</span>
<span>36</span>     <span>public</span> <span>mixed</span> getConstant(<span>string</span> name)               <span>//</span><span>取得该类特定常量信息</span>
<span>37</span>     <span>public</span> ReflectionClass[] getInterfaces()            <span>//</span><span>取得接口类信息</span>
<span>38</span>     <span>public</span> bool isInterface()  <span>//</span><span>测试该类是否为接口</span>
<span>39</span>     <span>public</span> bool isAbstract()   <span>//</span><span>测试该类是否为抽象类</span>
<span>40</span> 
<span>41</span> 4<span>:ReflectionParameter:
</span><span>42</span>     <span>public</span> <span>static</span> <span>string</span> export()     <span>//</span><span>导出该参数的详细信息</span>
<span>43</span>     <span>public</span> <span>string</span> getName()           <span>//</span><span>取得参数名</span>
<span>44</span>     <span>public</span> bool isPassedByReference() <span>//</span><span>测试该参数是否通过引用传递参数</span>
<span>45</span>     <span>public</span> ReflectionClass getClass() <span>//</span><span>若该参数为对象,返回该对象的类名</span>
<span>46</span>     <span>public</span> bool isArray()             <span>//</span><span>测试该参数是否为数组类型</span>
<span>47</span>     <span>public</span> bool allowsNull()          <span>//</span><span>测试该参数是否允许为空</span>
<span>48</span>     <span>public</span> bool isOptional()          <span>//</span><span>测试该参数是否为可选的,当有默认参数时可选</span>
<span>49</span>     <span>public</span> bool isDefaultValueAvailable() <span>//</span><span>测试该参数是否为默认参数</span>
<span>50</span>     <span>public</span> <span>mixed</span> getDefaultValue()        <span>//</span><span>取得该参数的默认值</span>
<span>51</span> 
<span>52</span> 5<span>:ReflectionExtension类
</span><span>53</span> 
<span>54</span>     <span>public</span> <span>static</span>  export()    <span>//</span><span>导出该扩展的所有信息</span>
<span>55</span>     <span>public</span> <span>string</span> getName()    <span>//</span><span>取得该扩展的名字</span>
<span>56</span>     <span>public</span> <span>string</span> getVersion() <span>//</span><span>取得该扩展的版本</span>
<span>57</span>     <span>public</span> ReflectionFunction[] getFunctions()   <span>//</span><span>取得该扩展的所有函数</span>
<span>58</span>     <span>public</span> <span>array</span> getConstants()  <span>//</span><span>取得该扩展的所有常量</span>
<span>59</span>     <span>public</span> <span>array</span> getINIEntries() <span>//</span><span>取得与该扩展相关的,在php.ini中的指令信息</span>
<span>60</span> }

写的比较急,难免会有错误,还请大神们多多指正。

转载请注明出处,谢啦!

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1065782.htmlTechArticlePHP反射API,反射api 近期忙着写项目,没有学习什么特别新的东西,所以好长时间没有更新博客。我们的项目用的是lumen,是基于laravel的一个...
성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
PHP : 서버 측 스크립팅 언어 소개PHP : 서버 측 스크립팅 언어 소개Apr 16, 2025 am 12:18 AM

PHP는 동적 웹 개발 및 서버 측 응용 프로그램에 사용되는 서버 측 스크립팅 언어입니다. 1.PHP는 편집이 필요하지 않으며 빠른 발전에 적합한 해석 된 언어입니다. 2. PHP 코드는 HTML에 포함되어 웹 페이지를 쉽게 개발할 수 있습니다. 3. PHP는 서버 측 로직을 처리하고 HTML 출력을 생성하며 사용자 상호 작용 및 데이터 처리를 지원합니다. 4. PHP는 데이터베이스와 상호 작용하고 프로세스 양식 제출 및 서버 측 작업을 실행할 수 있습니다.

PHP 및 웹 : 장기적인 영향 탐색PHP 및 웹 : 장기적인 영향 탐색Apr 16, 2025 am 12:17 AM

PHP는 지난 수십 년 동안 네트워크를 형성했으며 웹 개발에서 계속 중요한 역할을 할 것입니다. 1) PHP는 1994 년에 시작되었으며 MySQL과의 원활한 통합으로 인해 개발자에게 최초의 선택이되었습니다. 2) 핵심 기능에는 동적 컨텐츠 생성 및 데이터베이스와의 통합이 포함되며 웹 사이트를 실시간으로 업데이트하고 맞춤형 방식으로 표시 할 수 있습니다. 3) PHP의 광범위한 응용 및 생태계는 장기적인 영향을 미쳤지 만 버전 업데이트 및 보안 문제에 직면 해 있습니다. 4) PHP7의 출시와 같은 최근 몇 년간의 성능 향상을 통해 현대 언어와 경쟁 할 수 있습니다. 5) 앞으로 PHP는 컨테이너화 및 마이크로 서비스와 같은 새로운 도전을 다루어야하지만 유연성과 활발한 커뮤니티로 인해 적응력이 있습니다.

PHP를 사용하는 이유는 무엇입니까? 설명 된 장점과 혜택PHP를 사용하는 이유는 무엇입니까? 설명 된 장점과 혜택Apr 16, 2025 am 12:16 AM

PHP의 핵심 이점에는 학습 용이성, 강력한 웹 개발 지원, 풍부한 라이브러리 및 프레임 워크, 고성능 및 확장 성, 크로스 플랫폼 호환성 및 비용 효율성이 포함됩니다. 1) 배우고 사용하기 쉽고 초보자에게 적합합니다. 2) 웹 서버와 우수한 통합 및 여러 데이터베이스를 지원합니다. 3) Laravel과 같은 강력한 프레임 워크가 있습니다. 4) 최적화를 통해 고성능을 달성 할 수 있습니다. 5) 여러 운영 체제 지원; 6) 개발 비용을 줄이기위한 오픈 소스.

신화를 폭로 : PHP가 실제로 죽은 언어입니까?신화를 폭로 : PHP가 실제로 죽은 언어입니까?Apr 16, 2025 am 12:15 AM

PHP는 죽지 않았습니다. 1) PHP 커뮤니티는 성능 및 보안 문제를 적극적으로 해결하고 PHP7.x는 성능을 향상시킵니다. 2) PHP는 최신 웹 개발에 적합하며 대규모 웹 사이트에서 널리 사용됩니다. 3) PHP는 배우기 쉽고 서버가 잘 수행되지만 유형 시스템은 정적 언어만큼 엄격하지 않습니다. 4) PHP는 컨텐츠 관리 및 전자 상거래 분야에서 여전히 중요하며 생태계는 계속 발전하고 있습니다. 5) Opcache 및 APC를 통해 성능을 최적화하고 OOP 및 설계 패턴을 사용하여 코드 품질을 향상시킵니다.

PHP vs. Python 토론 : 어느 것이 더 낫습니까?PHP vs. Python 토론 : 어느 것이 더 낫습니까?Apr 16, 2025 am 12:03 AM

PHP와 Python에는 고유 한 장점과 단점이 있으며 선택은 프로젝트 요구 사항에 따라 다릅니다. 1) PHP는 웹 개발, 배우기 쉽고 풍부한 커뮤니티 리소스에 적합하지만 구문은 현대적이지 않으며 성능과 보안에주의를 기울여야합니다. 2) Python은 간결한 구문과 배우기 쉬운 데이터 과학 및 기계 학습에 적합하지만 실행 속도 및 메모리 관리에는 병목 현상이 있습니다.

PHP의 목적 : 동적 웹 사이트 구축PHP의 목적 : 동적 웹 사이트 구축Apr 15, 2025 am 12:18 AM

PHP는 동적 웹 사이트를 구축하는 데 사용되며 해당 핵심 기능에는 다음이 포함됩니다. 1. 데이터베이스와 연결하여 동적 컨텐츠를 생성하고 웹 페이지를 실시간으로 생성합니다. 2. 사용자 상호 작용 및 양식 제출을 처리하고 입력을 확인하고 작업에 응답합니다. 3. 개인화 된 경험을 제공하기 위해 세션 및 사용자 인증을 관리합니다. 4. 성능을 최적화하고 모범 사례를 따라 웹 사이트 효율성 및 보안을 개선하십시오.

PHP : 데이터베이스 및 서버 측 로직 처리PHP : 데이터베이스 및 서버 측 로직 처리Apr 15, 2025 am 12:15 AM

PHP는 MySQLI 및 PDO 확장 기능을 사용하여 데이터베이스 작업 및 서버 측 로직 프로세싱에서 상호 작용하고 세션 관리와 같은 기능을 통해 서버 측로 로직을 처리합니다. 1) MySQLI 또는 PDO를 사용하여 데이터베이스에 연결하고 SQL 쿼리를 실행하십시오. 2) 세션 관리 및 기타 기능을 통해 HTTP 요청 및 사용자 상태를 처리합니다. 3) 트랜잭션을 사용하여 데이터베이스 작업의 원자력을 보장하십시오. 4) SQL 주입 방지, 디버깅을 위해 예외 처리 및 폐쇄 연결을 사용하십시오. 5) 인덱싱 및 캐시를 통해 성능을 최적화하고, 읽을 수있는 코드를 작성하고, 오류 처리를 수행하십시오.

PHP에서 SQL 주입을 어떻게 방지합니까? (준비된 진술, pdo)PHP에서 SQL 주입을 어떻게 방지합니까? (준비된 진술, pdo)Apr 15, 2025 am 12:15 AM

PHP에서 전처리 문과 PDO를 사용하면 SQL 주입 공격을 효과적으로 방지 할 수 있습니다. 1) PDO를 사용하여 데이터베이스에 연결하고 오류 모드를 설정하십시오. 2) 준비 방법을 통해 전처리 명세서를 작성하고 자리 표시자를 사용하여 데이터를 전달하고 방법을 실행하십시오. 3) 쿼리 결과를 처리하고 코드의 보안 및 성능을 보장합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.