我悩PHP的参照渡
今日も今日とてバイトです。楽しいから良いけど。
そのバイト中、CSVでまとめたデータを形成して出力するというプログラムを書くことになったのですが。
とりあえずCSVの記述規則を考える。
それについては、私が昔に作ったプログラムでも同じ様なことをしたので、同じようにデザイン。
次にCSVからデータを取得して、インスタンスにつっこんでいくプログラムを書く。
そこでひとつ悩んだことが。
PHPで参照渡しをして、参照を返すのってどうやるの?
データの構造を、一部木構造(と言うよりは線形構造)にする必要があったので、そういう構造を作ったんです。具体的にはこんな感じ。
//クラス定義 class TREE{ var $id; var $name; var $data; var $next; function __construct($i, $n, $d, $next=null){ $this->id = $i; $this->name = $n; $this->data = $d; $this->next = $next; } } $tree1 = new TREE(適当なデータ); $tree1->next = new TREE(適当なデータ); $tree1->next->next = new TREE(適当なデータ);
で、この$tree1の末端、nextがnullになっている場所を探し出す必要があるとき、どうするかという話です。
$tmp = &(線形データ構造の最下層のTREEインスタンスを返してくれる関数)($tree1); $tmp->next = new TREE(適当なデータ);
こんな関数が欲しい。
仕事で使ってるサーバにはPHP4が入っているので、それを使わざるを得ません。
PHP4では変数に変数を代入すると、変数の中身がまるまるコピーされるのはわかっていたので、何とか参照を渡して受け取りたいな、と。
調べると、引数の前に「&」をつければ参照渡しになるらしい。
function hoge(&$fuga)
そして、関数名の前に「&」をつけて、結果を変数に代入する時にも関数名の前に「&」をつければ参照を受け取れるらしい。
function &hoge()... $a = &hoge();
という訳で、こんな関数書いてみた。
function &seekLastTree(&$t){ $p = $t; //$p = &$t;にした方が良かったのかなぁ if($p->next != null) $p = &seekLastTree($p); return $p; }
自信なかったけど、とりあえず動かしてみたら期待通りの結果を返してくれた。
$tmp = &seekLastTree($tree1); $tmp->next = new TREE(適当なデータ);
あー、PHPの中ではポインタとかがどんな扱いになってるのかわからないよ・・・
その点、C++とかだったら、オブジェクトのインスタンスもポインタで扱ったりするし、分かりやすいですな。
ポインタはとっつきにくいけど、プログラムが働くとき、メモリの中にどうやってデータが格納されていくのかがわかると、これほど便利な物は無いって思える・・・