Java
PHP
オブジェクト指向

protectedフィールドに孫クラスからアクセス(Java/PHP)

発端

仕事でPHPを触るようになりました。

フィールドがprotected 属性の場合、Java のように孫クラスから親クラスを参照できるだろうと自然と考えていましたが、孫クラスについての言及はググっても(僕の調べ方が悪いのでなければ)なかなかなく、派生クラス、子クラスについての話題が多かったです。

そんな中、PHPでは一つ先の継承にしかprotectedは反映されないという記述を目にし、実際にやってみるかーというのが今回の投稿です。
 

環境

PC

Windows 8.1

Java

Eclipse Kepler Service Release 2
jre8

PHP

XAMPP Version 7.0.24
PHP Version 7.0.24

Javaで動作確認

【2018/01/28 追記】デフォルトパッケージに下記javaファイルを配置

// 親クラス
abstract class Charactor {
    protected String name = "Charactor";
}

// 子クラス
class HumanCharactor extends Charactor {
}

// 孫クラス
class Wizard extends HumanCharactor {
    public Wizard (String name) {
        this.name = name;
    }
}

// テストコード
class Main {
    public static void main(String[] args) {
        System.out.println("Test Start...");

        Wizard wiz = new Wizard("Wizard");
        System.out.println(wiz.name);

        HumanCharactor human = new HumanCharactor();
        System.out.println(human.name);

        System.out.println("Test End...");
    }
}

結果

Test Start...
Wizard
Charactor
Test End...

PHPで動作確認

【2018/01/28 動作確認コード差し替え】

<?php
echo '<pre>';

// 親クラス
abstract class Charactor {
    protected $name = "Charactor";
}

// 子クラス
class HumanCharactor extends Charactor {
    public function printName() {
      var_dump($this->name);
    }
}

// 孫クラス
class Wizard extends HumanCharactor {
    public function __construct($name) {
        $this->name = $name;
    }

    //ここをcallするとFatal Error
    //public function printName() {
    //  var_dump($this->name);
    //}
}

// テストコード
new Test();
class Test {
    public function __construct() {
        var_dump("Test Start...");

        $wiz = new Wizard("Wizard");
        $wiz->printName();
        //var_dump($wiz->name); ←これだとFatal Error

        $human = new HumanCharactor();
        $human->printName();
        //var_dump($human->name); ←これだとFatal Error

        var_dump("Test End...");

        echo '</pre>';
    }
}
?>

結果

string(13) "Test Start..."
string(6) "Wizard"
string(9) "Charactor"
string(11) "Test End..."

まとめ

【2018/01/28 記載修正】
PHPでもJavaと同じように、親の親クラスのprotectedフィールドを使用することはできた。
ただしPHPはJavaと違って、孫クラスのインスタンスから直接親の親フィールドを参照することはできないようだ。