はむはむエンジニアぶろぐ

365日エンジニアリング

親クラスのフィールドへのアクセス場合は、getter/setterを使ったほうがいいと思う

他の言語は知らないけど、PHPではvisibilityが public 又は protected で宣言された親クラスのフィールドに $this でアクセスできてしまう。
public でフィールドを宣言することは、カプセル化を壊すことになるのでやらないと思うけど。

親クラスのフィールドを子クラスが、自由に変更できてしまうというのもカプセル化に反していると思う。
面倒くさいかもしれないけど、親クラスのフィールドは、 private で宣言してgetter/setterを使ったほうがいいと思う。

環境構成

  • PHP 5.6

親クラスのフィールドにアクセス

PHPでは、このように $this で親クラスのフィールドにアクセスできる。

<?php

abstract class AbsClass
{
    protected $hensu;

    public function echoHensu()
    {
        echo $this->hensu;
    }
}

class SubClass extends AbsClass
{
    public function __construct($hensu)
    {
        $this->hensu = $hensu;
    }
}

$sub = new SubClass('hoge');
// hogeが出力
$sub->echoHensu();

手軽に親クラスのフィールドにアクセスが出来る。
しかし、親クラスが用意するインターフェースとしてはフィールドではなくメソッド(getter/setter)のほうがよい。

setterを使うことによって、値の検証を差し込む余地が生まれる。
小クラスから親クラスのフィールドを自由にいじくり回せてしまうと、思わなぬバグを生んだり値の検証が散らばる可能性がある。

もし、変数に型があるのならば、型チェックは必ずしたほうが良い。
誤った使いかたを防止しましょう。

親クラスのフィールドにメソッドでアクセス

親クラスのフィールドにメソッド(setter/getter)を使ってアクセスする。
$hensu のvisibilityは、もちろん private にする。

<?php

abstract class AbsClass
{
    private $hensu;

    public function getHensu()
    {
        return $this->hensu;
    }

    public function setHensu($hensu)
    {
        $this->hensu = $hensu;
    }

    public function echoHensu()
    {
        echo $this->hensu;
    }
}

class SubClass extends AbsClass
{
    public function __construct($hensu)
    {
        $this->setHensu($hensu);
    }
}

$sub = new SubClass('hoge');
// hogeが出力
$sub->echoHensu();