変な風にRubyにかぶれてみる

Rubyを最近触りだして、イテレーション+ブロック渡しが好きになれそうなので、PHPでもやってみる。

% irb
irb(main):001:0> [1, 2, 3].each { |v| puts v*v }
1
4
9
=> [1, 2, 3]

基本的に、文法上の制限は許容。『メソッドの並びが処理順に書ける』事と『イテレーションに渡す処理をその場で書ける』事に注目。とりあえず、array_mapとcreate_functionがお気に入り。

array_map(
  create_function(
    '$v',
    'echo "$v\n";'
  ),
  array(1, 2, 3)
);
/** result
1
2
3
**/

改行とかインデントとかしてみたけど、いまいち読み難い。1行にしたらもっと読み難い。

require_once 'OO/Array.php';

$arr = new OO_Array(1, 2, 3);
$arr->each('$v', 'echo "$v\n";');
/** result
1
2
3
**/

そんなわけで、オレクラス書いてうさんくさいけどそれっぽくなったかも?クラス名とかよく分からないので適当にOOなArrayってことにしてみる。

PHPはC言語そのままっぽいところが多々あるので、RubyとかJSに慣れてるとちょっと書き難いかもしれないけど、組み込み関数とかPECLを利用すればそれっぽい書き方は出来るのかも。

こういうところも見直していって、自分に優しいコードを書くようにしないとかな。まあ、クラスの実装がへぼいのでパフォーマンスとか犠牲にする可能性があるし、何より『コードを書く量を増やす』事にもなるので、出来合いのライブラリとかあってほしいんだけど、ね。

ちなみに、今回書いたクラスはテストコードなので使う予定はありません。

<?php

class OO_Array
{

    private $_var;

    /**
     * 可変長の引数を配列として格納
     *
     * @param Mixed 可変長の要素
     *
     */
    public function __construct() {
        $n = func_num_args();
        if ($n >= 1) {
            $this->_var = func_get_args();
        } else {
            $this->_var = array();
        }
    }

    /**
     * 要素を全て返す
     *
     */
    public function get() {
        return $this->_var;
    }

    /**
     * 可変長の引数を配列として格納
     *
     * @param Mixed 可変長の要素
     *
     */
    public function set() {
        $n = func_num_args();
        if ($n >= 1) {
            $this->_var = func_get_args();
        } else {
            $this->_var = array();
        }
    }

    /**
     * 要素先頭を取り出す
     *
     * @return Mixed
     */
    public function shift() {
        if (sizeof($this->_var) > 0) {
            return array_shift($this->_var);
        } else {
            return null;
        }
    }

    /**
     * 可変長の要素を第1引数から順に先頭に追加
     *
     * @param Mixed 可変長の要素
     */
    public function unshift() {
        $n = func_num_args();
        for ($i = 0; $i < $n; $i++) {
            $v = func_get_arg($i);
            array_unshift($this->_var, $v);
        }
    }

    /**
     * 要素末尾を取り出す
     *
     * @return Mixed
     */
    public function pop() {
        if (sizeof($this->_var) > 0) {
            return array_pop($this->_var);
        } else {
            return null;
        }
    }

    /**
     * 可変長の要素を第1引数から順に末尾に追加
     *
     * @param Mixed 可変長の要素
     */
    public function push() {
        $n = func_num_args();
        for ($i = 0; $i < $n; $i++) {
            $v = func_get_arg($i);
            array_push($this->_var, $v);
        }
    }

    /**
     * 要素全てに対して指定の処理を行い、その結果配列を返す
     *
     * @param  string $arg  処理の引数(1次元目の各要素)
     * @param  string $func 処理
     * @return array
     */
    public function each($arg, $func) {
        if (sizeof($this->_var) == 0) {
            return null;
        }
        return array_map(create_function($arg, $func), $this->_var);
    }

    /**
     * 要素数を返す
     *
     * @return int
     */
    public function size() {
        return sizeof($this->_var);
    }

    /**
     * 配列文字列を返す
     *
     * @return string
     */
    public function dump() {
        return var_export($this->_var, true);
    }

    /**
     * 配列文字列から要素を生成
     *
     * @param string $source
     */
    public function import($source) {
        eval("\$this->_var=" . $source . ";");
    }

}

?>
プロフィール

このブログ記事について

このページは、koshigoeが2006年8月12日 00:06に書いたブログ記事です。

ひとつ前のブログ記事は「PHPのserializeとvar_export」です。

次のブログ記事は「ブログ検索はノイズ除去で四苦八苦?」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。