Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

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++の場合、演算子オーバーロードってどんなときに使うものなんでしょう?ごく普通に使われてるものなんでしょうか?