PHP 函数、魔术变量相关知识点

1、What does isDirty() means in Laravel?(stackoverflow)

When you want to know if the model has been edited since it was queried from the database, or isn't saved at all, then you use the  ->isDirty()  function.
简述:当你查询编辑数据库时:如果没有全部保存就使用isDirty();
 

public function  isDirty($attributes = null)

    {
        $dirty = $this->getDirty();
        if (is_null($attributes)) {
            return count($dirty) > 0;
        }

        if (! is_array($attributes)) {
            $attributes = func_get_args();
        }

        foreach ($attributes as $attribute) {
            if (array_key_exists($attribute, $dirty)) {
                return true;
            }
        }


        return false;

    }

2、__isset() 和 empty()

两个都是返回true和false、empty()判断是否为空,但是isset()判断为空,参数是否已经设置

php5以后的版本,类就可以使用魔术方法了。php规定以两个下划线开头的方法都保留为魔术方法,所以建议大家函数名最好不用__开 头,除非是为了重载已有的魔术方法。

目前php已有的魔术方法有

__construct,__destruct,__call,__get,__set,__isset,__unset,__sleep,__wakeup,__toString,__set_state 和 __clone。

__construct和__destruct

__construct和__destruct是类的构造函数和析构函数,这个大家经常会用到,相信大家都很熟悉,这里就不多说了。

__sleep和__wakeup

__sleep和__wakeup是序列化类的时候调用的。当序列化对象时,php将试图在序列动作之前调用该对象的成员函数__sleep(), 当使用unserialize() 恢复对象时, 将调用__wakeup()。

__toString

__toString是对象被转为string时调用必须有返回值即:return xxx ; 否则报错,例如

<code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="php" style="box-sizing: border-box;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"><?php</span>  
<span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Str</span>  
{</span>  
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$str</span>;  

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">function</span> <span class="hljs-title" style="box-sizing: border-box;">__construct</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(<span class="hljs-variable" style="box-sizing: border-box;">$str</span>)</span> {</span>  
        <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span>->str = <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$str</span>;  
    }  

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">function</span> <span class="hljs-title" style="box-sizing: border-box;">__toString</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">()</span> {</span>  
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span>->str;  
    }  
}  

<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$class</span> = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Str(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'Hello'</span>);  
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">echo</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$class</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 这里对象被转为了string,所以调用了__toString  </span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">?></span></span>  </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li></ul>

上例将输出 Hello

__set_state

__set_state是当用var_export()来导出类的时候调用的,这个魔术函数只有一个参数,这个参数是一个数组,用来指定 export的时候得到的属性。一般很少用到。

__call, __get和__set

__call, __get和__set 这三个魔术方法是最常用的当调用类中不存在的方法时就会调用__call,而__get和__set则是访问和设置类不存在的成员变量时调用的。 
这三个的函数原型如下:

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">mixed __call(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$name</span>, <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">array</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$arguments</span>)  
<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">void</span> __set(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$name</span>, mixed <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$value</span>)  
mixed __get(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$name</span>) </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

__call的例子:

<code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="php" style="box-sizing: border-box;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"><?php</span>  
<span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span>  <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Caller</span>  
{</span>  
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span>   <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">function</span>  <span class="hljs-title" style="box-sizing: border-box;">__call</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">( <span class="hljs-variable" style="box-sizing: border-box;">$method</span> ,  <span class="hljs-variable" style="box-sizing: border-box;">$args</span> )</span>  
    {</span>  
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">echo</span>   <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Method $method called:/n"</span> ;  
        print_r(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$args</span> );  
    }  
}  

<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$foo</span>  =  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span>  Caller();  
<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$foo</span> ->test(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>);  
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">?></span></span> </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li></ul>

上例将输出: 
Method test called: 
Array 

[0] => 1 
[1] => 2 
)

__get 和 __set 的例子:

<code class="hljs php has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"><?php</span>  
<span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">a</span>  
{</span>  
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$c</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;  
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$arr</span> = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">array</span>();  

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">function</span> <span class="hljs-title" style="box-sizing: border-box;">__set</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(<span class="hljs-variable" style="box-sizing: border-box;">$k</span>, <span class="hljs-variable" style="box-sizing: border-box;">$v</span>)</span>  
    {</span>  
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">echo</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$k</span> . <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"/n"</span>;          
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">echo</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$v</span> . <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"/n"</span>;  

        <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span>->arr[<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$k</span>] = <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$v</span>;  
    }  

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">function</span> <span class="hljs-title" style="box-sizing: border-box;">__get</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(<span class="hljs-variable" style="box-sizing: border-box;">$k</span>)</span>  
    {</span>  
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">echo</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"The value of $k is "</span> . <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span>->arr[<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$k</span>];  
    }  
}  
<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$a</span> = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> a;  
<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$a</span>->b = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 成员变量b不存在,所以会调用__set  </span>
<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$a</span>->c = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 成员变量c是存在的,所以不调用__set,无任何输出  </span>
<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$d</span> = <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$a</span>->b; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 成员变量b不存在,所以会调用__get  </span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">?></span>  </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li></ul>

上例将输出: 


The value of b is 1

__isset和__unset

__isset和__unset这两个与__get和__set其实原理是差不多的,他们的原型如下:

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">bool __isset(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$name</span>)  
<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">void</span> __unset(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$name</span>)  </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

举个例子:

<code class="hljs php has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"><?php</span>  
<span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span>  <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">a</span>  
{</span>      
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span>   <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$c</span>  = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>;  
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span>   <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$arr</span>  =  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">array</span> ( <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'a'</span>  => <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,  <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'b'</span>  => <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>);  

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span>   <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">function</span>  <span class="hljs-title" style="box-sizing: border-box;">__isset</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">( <span class="hljs-variable" style="box-sizing: border-box;">$k</span> )</span>  
    {</span>  
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span>  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">isset</span>( <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span> ->arr[ <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$k</span> ]);  
    }  

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span>   <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">function</span>  <span class="hljs-title" style="box-sizing: border-box;">__unset</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">( <span class="hljs-variable" style="box-sizing: border-box;">$k</span> )</span>  
    {</span>  
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">unset</span>(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span> ->arr[ <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$k</span> ]);  
    }  
}  
<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$a</span>  =  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span>  a;  

var_dump(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">isset</span>(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$a</span> ->a));  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 成员变量a不存在,所以调用__isset,返回true   </span>
var_dump(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">isset</span>(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$a</span> ->c));  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 成员变量c是存在的,没有调用__isset,同样返回true   </span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">unset</span>(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$a</span> ->b);  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 成员变量b不存在,调用__unset   </span>
var_dump(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$a</span> );  
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">?></span>  </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li></ul>

上例将输出:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">bool</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>)
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">bool</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>)
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">object</span>(a)<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#1 (2) {</span>
    [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"c"</span>]=><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>)
    [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"arr"</span>]=>array(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) {
         [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"a"</span>]=><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)
    }
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>
__clone

类复制(clone)的时候,如果有定义__clone这个魔术方法就会调用它。

举例如下:

<code class="hljs php has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"><?php</span>  
<span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span>  <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">a</span>  
{</span>      
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span>   <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">function</span>  <span class="hljs-title" style="box-sizing: border-box;">__clone</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">()</span>  
    {</span>  
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">echo</span>   <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"object cloned"</span> ;  
    }  
}  
<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$a</span>  =  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span>  a;  

<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$b</span>  =  <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$a</span> ;  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// $b只是$a的引用, 不是克隆,所以不调用__clone,没任何输出。   </span>
<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$c</span>  = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">clone</span>  <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$a</span> ;  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 调用了__clone,将输出 object cloned   </span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">?></span>  </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li></ul>

上例将输出:

object cloned

参考: http://php.net/manual/zh/language.oop5.magic.php

PHP的魔术常量

定义: 以两个_开头和结尾的常量为魔术常量 
注意: 魔术常量不区分大小写

<code class="hljs php has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"><?php</span>
<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$file1</span> = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">__FILE__</span>;
<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$file2</span> = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">__file__</span>;
var_dump(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$file1</span>);
var_dump(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$file2</span>);
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">?></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>

结果是: 
string(36) “F:\Apache\www\temp\php_demo\temp.php” 
string(36) “F:\Apache\www\temp\php_demo\temp.php”

_LINE_

文件中的当前行号。

_FILE_

文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。自 PHP 4.0.2 起,FILE 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。

_DIR_

文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于 dirname(FILE)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增)

_FUNCTION_

函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

_CLASS_

类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。类名包括其被声明的作用区域(例如 Foo\Bar)。注意自 PHP 5.4 起 CLASS 对 trait 也起作用。当用在 trait 方法中时,CLASS 是调用 trait 方法的类的名字。

_NAMESPACE_

当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)。

_TRAIT_

Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait 被定义时的名字(区分大小写)。Trait 名包括其被声明的作用区域(例如 Foo\Bar)。

_METHOD_

类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值