Maison  >  Article  >  développement back-end  >  PHP中静态与非静态的那些事情

PHP中静态与非静态的那些事情

WBOY
WBOYoriginal
2016-06-13 12:19:41759parcourir

PHP中静态与非静态的那些事儿

静态也能调用非静态方法

废话少说,直接看代码:

<code class="language-php hljs ">error_reporting(E_ALL);<span class="hljs-comment">// 将所有错误信息报出来</span><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Test</span>{</span>    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">test1</span><span class="hljs-params">()</span>    {</span>        <span class="hljs-comment">//$this->test2();// 这样子肯定是报错的,静态方法不能使用$this</span>        <span class="hljs-comment">// 如果非要在这里调用test2(),可以使用以下方式,称为方式一</span>        <span class="hljs-variable">$instance</span> = <span class="hljs-keyword">new</span> Test();        <span class="hljs-variable">$instance</span>->test2();        <span class="hljs-comment">// 或者使用更简单的方式,称为方式二(PHP会给出调用警告)</span>        <span class="hljs-keyword">self</span>::test2();    }    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">test2</span><span class="hljs-params">()</span>    {</span>        <span class="hljs-keyword">echo</span> <span class="hljs-string">'test static function'</span>;    }}Test::test1();</code>

这里要说明几点,
1. 方式一这种就是说创建一个对象,然后来调用这个对象的方法,这个不冲突的。
2. 至于方式二为什么能够这么调用非静态方法,这个请参考鸟哥的一篇文章:PHP的Calling Scope
方式二,产生如下警告:
这里写图片描述
所有大家在实际的应用中, 大家 尽量要避免 使用”::”来调用一个非静态的方法。

非静态方法调用静态方法竟如此多娇

想想我也是醉了,竟然还能使用$this来调用非静态方法。且看代码:

<code class="language-php hljs ">error_reporting(E_ALL);<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Test2</span>{</span>    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">test1</span><span class="hljs-params">()</span>    {</span>        <span class="hljs-keyword">echo</span> <span class="hljs-string">'good test<br />'</span>;    }    <span class="hljs-comment">// 大家可以想象这里我为什么不写test2()这个方法名呢?直接从1蹦跶到了3</span>    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">test3</span><span class="hljs-params">()</span>    {</span>        <span class="hljs-keyword">self</span>::test1();<span class="hljs-comment">// 这个可以吧,没有问题</span>        <span class="hljs-keyword">static</span>::test1();<span class="hljs-comment">// 这个也不解释了</span>        <span class="hljs-variable">$this</span>->test1();<span class="hljs-comment">// 重点说说它</span>    }}<span class="hljs-variable">$Obj</span> = <span class="hljs-keyword">new</span> Test2();<span class="hljs-variable">$Obj</span>->test3();</code>

写代码验证,这种$this竟然能够调用静态方法时,着实让我吃了一惊。仔细想想也是合理的,为什么合理?
且听小弟慢慢道来。

大家有没有这样调用过代码:

<code class="language-php hljs "><span class="hljs-variable">$obj</span> = <span class="hljs-keyword">new</span> Test2();<span class="hljs-variable">$obj</span>->test1();</code>

OK,在php中可以使用静态方式调用非静态方法,也可以使用非静态方式调用静态方法。多公平的一种语言呀,真是爱(che)死(dan)你了!
如果你能够理解上面这种写法,相信对于 $this->test1() 应该也能理解了吧, $this 相当于当前调用的对象,可以理解为此处new出来的 $obj 。作为一个对象肯定是可以调用它内部的所有方法吧?不解释了,说多了都是废话。

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn