PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHPの関数オーバーロードとオーバーライドの違いを徹底解説


PHPにおける関数のオーバーロード(Overloading)

関数のオーバーロードとは、同じ名前のメソッドを複数定義し、受け取る引数の数や型に応じて異なる処理を実行できるようにする仕組みです。JavaやC++などの言語では言語仕様としてサポートされていますが、PHPでは従来型のオーバーロードは直接サポートされていません。そこで、マジックメソッドの__call()を利用することで、引数の個数に応じて処理を切り替える、いわゆるオーバーロードのような動作を実現できます。

サンプルコード

<?php
class Shape {
    const PI = 3.142;

    function __call($name, $arg) {
        if ($name == 'area') {
            switch (count($arg)) {
                case 0: return 0;
                case 1: return self::PI * $arg[0];   // 円の面積(半径)
                case 2: return $arg[0] * $arg[1];    // 長方形の面積(縦×横)
            }
        }
    }
}

$circle = new Shape();
echo $circle->area(3);      // 引数1つ → 円の面積を計算

$rect = new Shape();
echo $rect->area(8, 6);     // 引数2つ → 長方形の面積を計算
?>

実行結果

9.42648

この例では、引数が1つの場合は円の面積(PI × 半径 = 3.142 × 3 = 9.426)、引数が2つの場合は長方形の面積(8 × 6 = 48)を計算しています。表示が「9.42648」になっているのは、2つのechoの出力が改行なしで連結されて表示されるためです。

PHPにおける関数のオーバーライド(Overriding)

関数のオーバーライドとは、親クラスで定義されたメソッドを、子クラスで同じメソッド名・同じ引数の数で再定義し、処理内容を上書きすることです。継承関係にあるクラス間で行われる点がオーバーロードとの大きな違いで、オブジェクト指向におけるポリモーフィズム(多態性)を実現するための基本的なテクニックです。

サンプルコード

<?php
class Base {
    function display() {
        echo "\nBase class function declared final!";
    }
    function demo() {
        echo "\nBase class function!";
    }
}

class Derived extends Base {
    // 親クラスのdemo()をオーバーライド
    function demo() {
        echo "\nDerived class function!";
    }
}

$ob = new Base;
$ob->demo();       // Baseクラスのdemo()
$ob->display();

$ob2 = new Derived;
$ob2->demo();      // オーバーライドされたDerivedクラスのdemo()
$ob2->display();   // 親クラスのdisplay()をそのまま継承
?>

実行結果

Base class function!
Base class function declared final!
Derived class function!
Base class function declared final!

この実行結果から分かるように、Derivedクラスのインスタンスでdemo()を呼び出すと子クラス側の処理が実行され、親クラスの処理は上書きされています。一方、display()は子クラスで再定義されていないため、親クラスの処理がそのまま呼び出されます。

なお、メソッドにfinalキーワードを付けると、子クラスによるオーバーライドを禁止できます。上記のコードでは出力メッセージに「final」という文言が含まれているだけで、実際にはfinal宣言は行われていません。本当に上書きを防止したい場合は、final function display() { ... }のように宣言します。

オーバーロードとオーバーライドの違いまとめ

比較項目オーバーロードオーバーライド
定義場所同一クラス内(PHPでは__call()で疑似的に実現)継承関係にある親子クラス間
メソッドのシグネチャ同名メソッドで引数の数・型が異なる同名・同引数でメソッドを再定義
主な用途引数に応じた処理の切り替え親クラスの処理の上書き・カスタマイズ

このように、オーバーロードは「同じ名前で異なる引数」によって複数の振る舞いを持たせる技術、オーバーライドは「継承したメソッドを子クラスで上書きする」技術です。目的も実装方法も大きく異なるため、混同しないよう整理して理解しておきましょう。

  1. PHPのis_subclass_of()関数とは?構文・パラメータ・使い方をわかりやすく解説

    is_subclass_of()関数とは PHPのis_subclass_of()関数は、指定したオブジェクトがあるクラスのサブクラス(子クラス)に属しているかどうかをチェックするための関数です。オブジェクト指向プログラミングにおいて、クラス間の継承関係を確認したい場面で活用できます。 構文 is_subclass_of(object, class, string) パラメータ object − 継承関係を検証する対象となるオブジェクト class − 親クラスとして確認するクラス名 string − false を設定すると、文字列として渡されたクラス名は許可されません 戻り値 オ

  2. PHPのclass_exists()関数とは?使い方とサンプルコードをわかりやすく解説

    概要PHPのclass_exists()関数は、指定したクラスがすでに定義されているかどうかをチェックするための関数です。クラスが定義済みであればTRUEを、未定義であればFALSEを返します。プラグインの読み込みや条件分岐によるクラスの動的な利用など、柔軟なプログラミングに役立ちます。構文class_exists(class, autoload)パラメータclass − 存在を確認したいクラスの名前。autoload − デフォルトでオートロード機構(__autoload / spl_autoload_call)を呼び出すかどうか。省略した場合のデフォルト値はTRUE