(PHP)「self::」と「$this」の違い【使い分け方なども紹介】

(PHP)「self::」と「$this」の違い【使い分け方なども紹介】

 

本記事では、
PHPの「self::」と「$this」の違いや、使い分けについて、解説していく。

 

 

$thisとは

$thisは、自分自身の「オブジェクト」を指す。
インスタンス化した際、クラス内のメンバ変数やメソッドにアクセスする際に使用する。

phpのself::と$thisの違い

 

実際にサンプルコードで確認する。

<?php

class Colors {

    public $colors = 'red ';
    public function output_colors_name() { return 'blue '; }

    function test() {
        echo $this->colors;
        echo $this->output_colors_name() ;
    }

}

$obj = new Colors();
$obj->test();

 

出力結果

red blue

 

インスタンス化したオブジェクト自身が、コールしたtest()メソッド内から$this->を使ってechoしているのは、自身(オブジェクト)の変数やメソッドだ。

 




self::とは

self:: は、自クラスを示す。
自クラスというのは、言葉通り、class Colors {}というクラスがあれば、そのクラス自体のことである。オブジェクトとは異なる点に注意しよう。

phpのself::と$thisの違い

 

そしてself:: を理解する上で覚えておきたい変数が、
クラス定数と、static変数だ。

const COLORS = 'red ';                            //クラス定数
public static $colors = 'blue ';      //static変数

クラス定数と、static変数は、静的プロパティとも呼ばれ、
オブジェクト自体の変数ではなく、クラスそのものに属する変数であることをまずは理解しよう。

 

そのため、クラス定数と、static変数にアクセスする場合は、
$thisは使用せず、代わりにselfを使用する。

<?php

class Colors {

    const COLORS = 'red ';
    public static $colors = 'blue ';

    function test() {
        echo self::COLORS;
        echo self::$colors;
    }

}

$obj = new Colors();
$obj->test();

 

出力結果

red blue

 

先ほどと同様のことをしているように見えるが、出力しているredとblueという値が、「オブジェクト自身の変数」ではなく、静的プロパティである「クラス自身の変数」であるという認識を持ってもらいたい。

 




「self::」と「$this」の違い・使い分け

では、最後に改めて、
「self::」と「$this」の違い・使い分けについてまとめる。

 

「self::」と「$this」の違い

 

  • self::は自クラスを表し、$thisは自身のオブジェクトを表す。
  • self::はクラス定数やstatic変数など静的なプロパティにアクセスできるのに対し、
    $thisは静的なプロパティにはアクセスできない。

 

「self::」と「$this」の使い分け

静的なプロパティにアクセスする際は、self::を使用し、
動的なプロパティやメソッドにアクセスする際は$thisを使用するなどの使い分けをする。

 

どういうことかと言うと、
下記のプログラムを実行すると、self::と$thisの違いを確認できる。

<?php

class Parent {

    function test() {
        self::who(); //  'parent'
        $this->who(); //  'child'
    }

    function who() {
        echo 'parent ';
    }

}

class Child extends Parent {

    function who() {
        echo 'child ';
    }

}

$obj = new Child();
     $obj->test();

 

出力結果

parent child

 

上記プログラムは、
self::は自クラスを表し、$thisは自身のオブジェクトを表すことを確認できる。

  • self::who()の場合はParentClass自身のwho()メソッドを実行しているのが分かる。
  • $this->who()の場合は、Childクラスをインスタンス化しているため、ChildClasswho()メソッドを実行しているのが分かる。

 

 

関連記事

 

(PHP) アクセス修飾子【public, protected, privateの違い】

(PHP) アクセス修飾子【public, protected, privateの違い】

 

https://www.php.net/manual/ja/language.oop5.paamayim-nekudotayim.php

https://www.php.net/manual/ja/language.oop5.basic.php

 

記事が気に入った方はシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。