operator拡張モジュール
2006年2月以降全くメンテされてなさそうな拡張モジュールなんですが、気になっていたので見てみました。
Operator overloading for: +, -, *, /, %, <<, >>, ., |, &, ^, ~, !, ++, --, +=, -=, *=, /=, %=, <<=, >>=, .=, |=, &=, ^=, ~=,
==, !=, ===, !==, <, and <= operators.
Conditional support for > and >= available with application of a patch.
operator拡張モジュールをインストールすると演算子オーバーロード用のマジックメソッドが追加されるので、これを使ってオーバーロードを実現するようです。この「メソッドで定義する」のって、C++の演算子オーバーロードに近いんでしょうか?
で、先日の配列の足し算っぽいサンプルを書いて、
<?php class ArrayObj { private $array = null; public function __construct(array $array) { $this->array = $array; } public function __add(array $array) { $this->array = array_merge($this->array, $array); return $this->array; } } $fruit1 = array('apple', 'banana', 'cherry'); $fruit2 = array('kiwi', 'lemon', 'melon'); $array = new ArrayObj($fruit1); var_dump($array + $fruit2);
PHP5.2.6で動作確認。
$ php -v PHP 5.2.6 (cli) (built: May 27 2008 16:58:19) Copyright (c) 1997-2008 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies with Xdebug v2.0.3, Copyright (c) 2002-2007, by Derick Rethans with eAccelerator v0.9.5.3, Copyright (c) 2004-2006 eAccelerator, by eAccelerator $ php -i | grep -i operator operator operator overloading support => + - * / % << >> . | & ^ ~ ! ++ -- += -= *= /= %= <<= >>= .= |= &= ^= ~= === !== == != < <= $ php operator_test.php array(6) { [0]=> string(5) "apple" [1]=> string(6) "banana" [2]=> string(6) "cherry" [3]=> string(4) "kiwi" [4]=> string(5) "lemon" [5]=> string(5) "melon" } $
なるほど。上の例では単にarray_mergeすれば良いだけなのでメリットが分かりにくいけど、使い方によっては「分かりやすいコード」になりそう。とはいえ、
- 拡張モジュールをインストールする必要がある
- コードが拡張モジュールに完全に依存
- その拡張モジュールが今現在メンテされてない(これ以上メンテの必要がない?)
なので、導入の敷居とリスクが高いですが。。。
ちなみに、C++の場合、演算子のオーバーロードってどんなときに使うものなんでしょう?ごく普通に使われてるものなんでしょうか?