魔法使いの卵

WEBエンジニアの卵の成長記録

PHPによく出てくる::(スコープ演算子)ってなんやねん。読み方わからんわw

まず、マニュアルのスコープ演算子をみてみた。

スコープ定義演算子 (::)

スコープ定義演算子 (またの名を Paamayim Nekudotayim)、 平たく言うと「ダブルコロン」は、トークンのひとつです。 static, 定数 およびオーバーライドされたクラスのプロパティやメソッドにアクセスすることができます。これらの要素をクラス定義の外から参照する際には、 クラスの名前を使用してください。PHP 5.3.0 以降では、変数を用いてクラスを参照することも可能です。 変数の値に (self や parent、 static といった) キーワードを指定することはできません。

 

スコープってなんや?

プログラミングにおけるスコープとは、あるコンピュータ・プログラムにおいて、変数や関数などの識別子(identifier)が参照できる範囲(有効範囲)をいう。ネットワーク(TCP/IP)においては、DHCPサーバがクライアントに割り当てるIPアドレスの範囲を指す。

 なるほど。
 たとえばAクラス内で作ったクラス変数が他のクラスで使うことができんのは
 このスコープの参照範囲外ってことやな。
 メソッドも確か他のメソッドで使えなかった気がするけど
 それもスコープの範囲外ってことか。

 

トークンってなんや??

トークン (プログラミング言語)とは、プログラミング言語ソースコードを構成する単語や記号の最小単位のことである。

 ほぉ、::がトークンってことは理解したぞ。
 最小単位やな。okok

 ここまでは理解できた。

 

注意点

変数にself や parent、 staticっていう命名はできない。

 

self:: parent:: static::ってでてきてるけどそれぞれなんなん?

◼︎クラス名::

使用可能な場所:クラス定義の中と外
明示されたクラス
クラス名さえ書いておけば、どのクラスを使うのかわかるためどこでも使える。

 

self::

使用可能な場所:クラス定義の中
自クラスのプロパティ、及びメソッドへの静的アクセス。

 静的アクセスとは?
 staticなメソッドに関してはインスタンス化の有無を問わず呼び出すことが可能。

 

◼︎parent::

使用可能な場所:クラス定義の中
親クラスのプロパティやメソッドを呼び出すことが可能。


◼︎static::

使用可能な場所:クラス定義の中
直近の "非転送コール" のクラス

 

非転送コール??なにそれwそしたら転送コールってのもあるんとちゃうの?w

非転送コール:

C::foo()や$c->foo()といったクラス名(もしくはオブジェクト)を明示した呼び出し

 

転送コール :

self:: parent:: static::もしくはクラス階層の中での forward_static_call() での呼び出し

 

てか非転送コールでぐぐったら出てくる遅延静的束縛ってなんやねんwwww

遅延静的束縛:

非転送コール時に、明示されたクラス名(もしくはオブジェクトのクラス名)を保持する機能

 

わからんわw

もっとわかりやすく噛み砕いて言うとなんやねん・・・

遅延静的束縛は直近の “非転送コール” のクラス名を保存します。

 

 たぶん処理中の直近の非転送コールのクラス名のことやとおもう。


うん、理解するのにすごい時間かかった。

特に遅延静的束縛。

これむずかしいなぁ。

下記のブログがすごい参考になったから紹介。


遅延静的束縛は何が嬉しいのか - 暁 [stfuawsc]


PHPを愛する試み 〜self:: parent:: static:: および遅延静的束縛〜 - maeharinの日記

 

でも、実際まだ概要っていうか
それぞれの使い方の違いがわかったーってレベルの理解度。
実用レベルの理解度には至っていない。(実装のイメージが湧かない...)

 

まとめ
::(スコープ演算子)には4つのパターンが存在する

◼︎クラス名::

使用可能な場所:クラス定義の中と外
明示されたクラス
クラス名さえ書いておけば、どのクラスを使うのかわかるためどこでも使える。

 

self::

使用可能な場所:クラス定義の中
自クラスのプロパティ、及びメソッドへの静的アクセス。

 

 静的アクセスとは?
 staticなメソッドに関してはインスタンス化の有無を問わず呼び出すことが可能。

 

◼︎parent::

使用可能な場所:クラス定義の中
親クラスのプロパティやメソッドを呼び出すことが可能。

 

◼︎static::

使用可能な場所:クラス定義の中
直近の "非転送コール" のクラス

 

非転送コール:

C::foo()や$c->foo()といったクラス名(もしくはオブジェクト)を明示した呼び出し

 

転送コール :

self:: parent:: static::もしくはクラス階層の中での forward_static_call() での呼び出し

 

遅延静的束縛:

非転送コール時に、明示されたクラス名(もしくはオブジェクトのクラス名)を保持する機能

遅延静的束縛は直近の “非転送コール” のクラス名を保存します。


どれを使うのか?を理解して適切に使い分けることが
可読性の高いソースであったり綺麗なソースっていうのものに
なるんじゃないのかってやってておもった。
しかしむずかしい。