PHP の静的および非静的もの

WBOY
リリース: 2016-06-13 12:19:41
オリジナル
756 人が閲覧しました

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. メソッド 1 は、オブジェクトを作成し、そのオブジェクトのメソッドを呼び出すことを意味します。これは競合しません。
2. メソッド 2 がこのように非静的メソッドを呼び出せる理由については、Brother Niao の記事「PHP の呼び出しスコープ」を参照してください。
メソッド 2 では次の警告が生成されます:
PHP の静的および非静的もの
すべて 実際のアプリケーションでは、「::」を使用して非静的メソッドを呼び出す を回避しようとします。

非静的メソッドから静的メソッドを呼び出すのはとても簡単です

それについて考えるととても酔ってしまいますが、$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 では、静的メソッドを使用して非静的メソッドを呼び出すことができます。また、非静的メソッドを使用して呼び出すこともできます。静的メソッド。なんて公平な言葉だ、私は本当にあなた(チェ)を死ぬほど愛しています(ダン)!
上記の書き方が理解できれば、$this->test1()が現在の呼び出しのオブジェクトに相当し、ここでは新しい$thisと理解できると思います。オブジェクトとして、その中のすべてのメソッドを呼び出すことができなければなりませんよね?説明しなければ、それはすべてナンセンスです。 $obj

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート