PHPのfinalキーワードとは?メソッドとクラスでの使い方を解説
PHPのfinalキーワードは、メソッドやクラスに対して指定できる修飾子です。メソッドにfinalを付けるとサブクラスによるオーバーライド(上書き)が禁止され、クラスに付けるとそのクラスは継承できなくなります。これにより、開発者の意図しない改変からコード設計を守ることができます。
finalメソッドの例
まずは、メソッドにfinalキーワードを付けた例を見てみましょう。以下のコードでは、Baseクラスのdisplay()メソッドがfinalとして宣言されています。
<?php
class Base {
final function display() {
echo "Base class function declared final!";
}
function demo() {
echo "Base class function!";
}
}
class Derived extends Base {
function demo() {
echo "Derived class function!";
}
}
$ob = new Derived;
$ob->demo();
?>
出力結果
このコードを実行すると、以下の出力が得られます。
Derived class function!
この例では、final宣言されているのはdisplay()メソッドのみであり、実際にオーバーライドしているのはfinalではないdemo()メソッドだけです。そのためエラーは発生せず、プログラムは正常に動作します。
finalクラスの例
次に、クラス自体にfinalキーワードを付けた場合の例を見てみましょう。
<?php
final class Base {
final function display() {
echo "Base class function declared final!";
}
function demo() {
echo "Base class function!";
}
}
class Derived extends Base {
function demo() {
echo "Derived class function!";
}
}
$ob = new Derived;
$ob->demo();
?>
出力結果
今度はfinalクラスであるBaseを継承しようとしたため、実行時に致命的なエラー(Fatal Error)が発生します。
PHP Fatal error: Class Derived may not inherit from final class (Base) in /home/cg/root/6985034/main.php on line 19
まとめ
finalキーワードの役割は以下の2点にまとめられます。
- メソッドに付けた場合 … サブクラスによるメソッドのオーバーライドを禁止する
- クラスに付けた場合 … クラスの継承自体を禁止する
ライブラリやフレームワークの開発では、外部コードによる予期しない拡張や変更を防ぐ目的で、finalキーワードがよく活用されています。ただし、使いすぎるとテストや拡張の柔軟性が損なわれることもあるため、設計意図に応じて適切に使用することが大切です。
-
Javaのfinalクラスとは?継承を禁止する仕組みと使い方を徹底解説
Javaにおいて、クラスにfinal修飾子を付けて宣言する最大の目的は、そのクラスがサブクラス化(継承)されることを防ぐことです。クラスがfinalとして宣言されると、どのクラスもそのクラスを継承できなくなり、finalクラスの機能や振る舞いを拡張・変更することが不可能になります。finalクラスの基本構文finalクラスの宣言は非常にシンプルです。クラス名の前にfinalキーワードを付けるだけです。public final class Test { // クラスの本体 }このように宣言されたTestクラスに対して、以下のような継承を試みるとコンパイルエラーが発生します。// コンパイ
-
Javaのfinalキーワードとは?変数・メソッド・クラスでの使い方を解説
finalは、Javaにおける非アクセス修飾子のひとつです。クラス、メソッド、変数の実装を「確定」させるために使用され、これらが後から変更されることを防ぐ役割を持ちます。本記事では、finalキーワードの基本的な概念と、変数・メソッド・クラスそれぞれでの使い方をコード例とともに解説します。final変数final変数は、明示的に初期化できるのは一度だけです。また、finalで宣言された参照変数は、別のオブジェクトを参照するように再代入することはできません。ただし、オブジェクト内部のデータ自体は変更可能です。つまり、オブジェクトの「状態」は変えられるものの、「参照先」は変えられないという点に注意