php finalを使用して継承を禁止する

php finalを使用して継承を禁止する

phpで修飾子finalを使って、継承を禁止する手順を記述してます。

環境

  • OS CentOS Linux release 8.1.1911 (Core)
  • PHP 7.4.5

※CentOs8 php7.4をインストールする手順はこちら

継承禁止

まずは、finalを使用せずに継承してみます。

<?php
class test
{
    function func1()
    {
        echo "hello world";
    }
}

class childtest extends test
{
    function func2()
    {
        $this->func1();
    }
}

$obj = new childtest;
$obj->func2();

実行結果

継承できることが、確認できます。

それでは、finalをつけて継承を禁止してみます。

<?php
final class test
{
    function func1()
    {
        echo "hello world";
    }
}

class childtest extends test
{
    function func2()
    {
        $this->func1();
    }
}

$obj = new childtest;
$obj->func2();

継承できずにエラーになることが確認できます。

PHP Fatal error:  Class childtest may not inherit from final class (test)

オーバーライド禁止

finalはオーバーライドも禁止することができます。

まずは、finalを使用せずに、オーバーライドした実行結果を表示します。

<?php
class test
{
    function func1()
    {
        echo "hello world";
    }
}

class childtest extends test
{
    function func1()
    {
        echo "オーバーライド";
    }
}

$obj = new childtest;
$obj->func1();

実行結果

finalを使ってオーバーライドを禁止します。

<?php
class test
{
    final function func1()
    {
        echo "hello world";
    }
}

class childtest extends test
{
    function func1()
    {
        echo "オーバーライド";
    }
}

$obj = new childtest;
$obj->func1();

実行エラーとなります。

PHP Fatal error:  Cannot override final method test::func1()