PHP4
私はお仕事でPHP(バージョン4)なる言語を使っております。このPHPという代物ですが、計算機の歴史的にはそろばんと最古を争うほどの前時代的言語でして、アインシュタインレベルの頭脳さえあれば誰でも使える言語といえます。
なんとなく適当に書いてみる
PHP4というのは、大体以下のような形となります。
<?php class Person{ var $name; var $age; function Person(&$name, $age){ $this->name =& $name; $this->age = $age; } function getAge(){ return $this->age; } function getName(){ return $this->name; } function setName($name){ $this->name = $name; } } ?>
(PHP5にはありますが、)アクセス修飾子のprivateなどはありません。それから、staticな関数もありません(関数内にstaticな変数を持つことはできる)。コンストラクタはクラス名の関数となります(PHP5ではそうでない記法が標準的)。参照渡しが変態的(PHP5では代入の動きがかなり変わっている)。
といった、長所がありますので、大変重宝しております。
参照渡し
一つ、参照渡しについてお伝えしておきましょう。「PHP4においては」、代入はコピーを意味いたします。cloneということですね。シャローコピーを行います。
<?php $p = new Person("山田太郎", 23); $p2 = $p; $p->setName("山田かまち"); ?>
ここで、$p2->getName()の値は、"山田太郎"となります。すなわち、$p2はコピーされた$pであり、$pの値をいじっても、$p2には影響しません。
<?php $p3 =& $p; ?>
とすれば、$p3は$pの別名となります。
<?php function abc(&$a){ .... } ?>
のように書くと、$aは参照渡しされます。すなわち呼出側の変数の別名となります。
<?php $names = array("山田", "田中", "佐藤"); $persons = array(); foreach($names as $name){ $persons[$i++] = new Person($name, 20);; } foreach($persons as $person){ print $person->getName()."\n"; } ?>
とすると、全て「佐藤」が出力されます。当り前といえば当り前なのですが、うかつに参照を使っていると間違ってしまいます。