埼玉在住エンジニアのナレッジ帳

webのエンジニアをやっており、日頃の開発で詰まったことについて残していきたいと思っています。https://ikujip.jpの開発も行っているため、そこで使った知識なども載せられればと思います。

PHPとJavaのthis事情

プログラムを始めたばかりの人は、
ある程度の規模のソースを書くまでthisの意味を理解するのが大変ですよね。
PHPJavaもthisの使い方は基本的には同じで、
あるクラスのメンバ変数やメソッドを指定する時に使います。
ちょっと違う点としては、Javaの方はthisの記述を省略できる場合があります。

それぞれの例を出すと、

PHP

<?php
public class thisTest() {
    private $var = "This is a pen.";
 
    public function displayVar() {
        echo $this->var;
    }
}
Java
public class thisTest() {
    private String var = "This is a pen.";
 
    public void displayVar() {
        System.out.println(this.var);
    }
}

どちらもdisplayVar()メソッドを呼び出すと「This is a pen.」と出力されるのはわかりますね。
この場合、thisはともにクラス名の後に宣言しているvar変数(いわゆるメンバ変数)のことを指しています。
PHPでは基本的にメンバ変数を使う時にthisを省略することはできませんが、Javaでは省略して書くことができるのです。
よって、先ほどのJavaの例は以下のように書くことができます。

public class thisTest() {
    private String var = "This is a pen.";
 
    public void displayVar() {
        System.out.println(var); // ここが変わった
    }
}

注意したいのは以下のようにメンバ変数もローカル変数も同じ以下のような時です。

public class thisTest() {
    private String var = "This is a pen.";
 
    public void displayVar() {
        String var = "This is an apple."; // ローカル変数
        System.out.println(var);
    }
}

これで実行すると、ローカル変数の方が呼ばれることになり、
出力されるのは「This is an apple.」になります。

もしもメンバ変数の方を呼び出したい時は、省略しないで以下のようにthisをつける必要があります。

public class thisTest() {
    private String var = "This is a pen.";
 
    public void displayVar() {
        String var = "This is an apple.";
        System.out.println(this.var); // thisつけた
    }
}

ややこしいですが、普通はメンバ変数があればそれと名前の変数は使わないですよねw