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 . ";");
}
}
?>

