なぞなぞPHP

やはり、PHPでは世の中ではアクセス制限を強めるオーバーロードは出来ないようで、次のようなコードではエラーが発生します。

class Hikikomori extends Neet{
    protected $name = 'hiki-';
}
class Neet{
    public $name = 'neeeet';
}

PHP Fatal error: Access level to Hikikomori::$name must be public (as in class
Neet)

その逆ではエラーは出ません。うわーホントにJavaと反対だ。←うそだうそだJavaも同じだ

class Hikikomori extends Neet{
    protected $name = 'hiki-';
}
class Neet{
    private $name = 'neeeet';
    
    public function getName(){
        return $this->name;
    }
}

$h = new Hikikomori();
print $h->getName();

neeeet

さて、このコードの出力がneeeetである理由はNeetの$nameがprivateであるからで、protectedにするとうまくいく。

class Hikikomori extends Neet{
    protected $name = 'hiki-';
}
class Neet{
    protected $name = 'neeeet';
    
    public function getName(){
        return $this->name;
    }
}

$h = new Hikikomori();
print $h->getName();

hiki-

ちゃんと引きこもりとして継承された変数の内容が表示されました。よかったよかった。
しかし、Javaだとコンパイルエラーになるというのに、PHPは不思議言語です。Javaだとprivate→privateでも…とか思って試してみたら普通にエラーにならないし。あれ?もうだめだ


それはさておき、これをstaticな変数nameに書き換えてみます。

class Hikikomori extends Neet{
    protected static $name = 'hiki-';
}
class Neet{
    protected static $name = 'neeeet';
    
    public function getName(){
        return self::$name;
    }
}

$h = new Hikikomori();
print $h->getName();

neeeet

引きこもりなのにニートと出力されてしまいました。これを回避する(ちゃんとひきこもりと出力する)方法はあるのでしょうか…。
無理矢理リフレクションを使えば解決できたけれど、こんなんでいいのかと。

private function getNameStatic(){
    $class = new ReflectionClass($this);
    eval( "\$name = ".$class->getName()."::\$name;" );
    
    return $name;
}

勉強不足。


結論。
Javaにおいて、親クラスのメソッドから子クラスのメソッドは呼び出せますが、変数はだめみたい。
staticにするとどっちみち無理。
でもPHPだと親クラスのメソッドから子クラスの変数も呼び出せるというわけです。
たけどstaticは無理。
staticは継承されないというのは、世の条理なのでしょうか。


なんで今更こんな基本的な事柄っぽいものを確認しているのか。