HOME > blog > PHP > PHPでプライベートメソッドをオーバーライドした際の挙動

PHPでプライベートメソッドをオーバーライドした際の挙動

例えば以下のようなPHPのコードがあったとして、このスクリプトを実行した場合、アクセス権の設定通り親クラスのプライベートメソッドをサブクラスからオーバーライドすることはできませんが、同時にその点についての警告なども返ってきません

<?php
class test1 {
    public function hoge () {
        echo $this->bar();
    }
    private function bar () {
        return "bar from test1\n";
    }
}

class test2 extends test1 {
    private function bar () {
        return "bar from test2\n";
    }
}

$a = new test2;
$a->hoge();

以下、実行結果。

$ php ooTest.php
$ bar from test1

個人的には何かしらの警告を返して欲しいなぁ。ちなみに同じことをrubyで実行した場合はコンパイルエラーになります。

class Test1
    public
    def hoge ()
        print self.bar;
    end
    private
    def bar ()
        return "bar from Test1\n";
    end
end

class Test2 < Test1
    private
    def bar ()
        return "bar from Test2\n";
    end
end

a = Test2.new;
a.hoge();

以下、ruby版の実行結果

$ ruby ooTest.rb
ooTest.rb:4:in `hoge': private method `bar' called for # (NoMethodError)
     from ooTest.rb:20
カテゴリー: PHP
  • まつ

    これ、エラーに気づきづらいですよね。。。