- 2006-10-06 (金) 11:49
- PHP
JavaやC/C++など一般的な言語でのオーバーロードとPHPでいうオーバーロードは違います。
一般的なオーバーロードの定義は下のとおりです。
プログラミングにおいて、戻り値や引数の数やデータ型(シグネチャ)が異なる同名の関数やメソッドを多重定義すること。
オーバーロードとは 【overload】 ─ 意味・解説 : IT用語辞典 e-Words (2006-10-06)
Javaで書くとこんな感じです。
class Hoge {
  public void foo() {
  }
  public void foo(String bar) {
  }
  public void foo(int bar) {
  }
  public void foo(int bar, boolean flag) {
  }
}
				同じfooメソッドを呼んでも引数によって実際に呼ばれるメソッドが変わります。
これをPHPで書くとこんな感じです。
< ?php
class Hoge {
  // 引数が一個だけなら
  function foo($bar) {
  }
  // 引数の数が変化するなら
  function foo() {
    $args = func_get_args();
  }
}
?>
				厳密にはオーバーロードでは無いでしょうけど同じように動作するのでこれで良いと思っていました。ですのである日、PHPでオーバーロードができるようになった、と聞いてもピンッと来ませんでした。
PHPでいうオーバーロードは以下のような感じです。
この拡張モジュールの用途は、オブジェクトのプロパティへのアクセスと メソッドのコールのオーバーロードを可能にすることです。
オブジェクトプロパティとメソッドコールのオーバーロード (2006-10-06)
class Hoge {
  // PHP4
  function __call($method, $params, &$return) {
  }
  // PHP5
  function __call($method, $params) {
  }
}
// PHP4
overload('Hoge');
?>
				この場合Hogeクラスに定義されていないメソッドを呼ぶと__callが呼ばれます。
つまりPHPでいうオーバーロードは「定義された変数、メソッドが無い場合に呼ばれるメソッド」と言った意味合いになってます。
他のLL言語にも「PHPのオーバーロード」のような機能はある(Perl:AUTOLOAD/Ruby:method_missing/Python:__call__?)のですが、「オーバーロード」という表現ではありません。(「オーバーロード」はC/C++と同じ演算子オーバーロードで使われています)
なぜPHPはこの機能に「オーバーロード」と名付けたのでしょうか。。。
				はじめてC++でオーバーロードを見た時に「おースマートだ」と感激しました。「オーバーロード」という響きも好きですし、この言葉にはちょっと思い入れがあったので気になっていました。まあ他言語から移る方はお気をつけて、という事で。
				# 昔オーバーロードとオーバーライドがごちゃごちゃになってたのはナイショです。:-P
				
- Newer: SQLiteに全文検索
- Older: Google Code Search-ソースコード検索サイト
トラックバック:0
- このエントリーのトラックバックURL
- /blog/2006/10/php_overload.html/trackback
- Listed below are links to weblogs that reference
- PHPのオーバーロード from Shin x blog



