JavaからPHPに入った私がこれってどうなるんだろうと不安で仕方なかった部分の実験です。
適当に少々まとめました
本文はコメントとして記述しています
Test.php
<?php
ini_set('display_errors', 1);
// array_values は値が null のものも除去するのか
// 期待 Array ( [0] => 0 [1] => [2] => 2 ) nullもnullという値なのだから除去して欲しくない
// 結果 Array ( [0] => 0 [1] => [2] => 2 )
// null は除去されない やったね^^
print_r(array_values(array(0, null, 2)));
/*
↑↑ちなみに array_values は引数省略でオブジェクトを文字列として比較していますので独自クラスで使用するには独自クラスに
public function __toString()
の定義?オーバーライド?が必要です。
(ちょっとJavaっぽい)
*/
// 配列要素の参照を unset するとどうなるか
// 期待 Array ( [0] => 0 [2] => 2 ) foreachでの削除が便利なのでできないかなー
// 結果 Array ( [0] => 0 [1] => 1 [2] => 2 )
// 削除できない あくまで参照という変数をunsetしただけ
$values = array(0, 1, 2);
foreach ($values as $i => &$v) {
if ($i == 1) {
unset($v);
}
}
//ここで unset($v) すべきだが今回は実験なのでややこしくなるすぐ下の下記で説明
print_r($values);
/*
↑↑注意!特に foreach の参照を使用する場合、 foreach のブロックを抜けたときに
参照に使った $v を unset すべき(phpではJavaと違い変数のスコープが変態)
なぜならこのコードの後に $v という変数を新しく定義&初期化したつもりで
$v = 0; などと書いてしまうと、 $v は参照になっているため 配列の要素が書き換えられてしまう。
ちなみに、C言語系ではintなどは参照渡しより値渡しのほうが高速
これも考えてみれば当たり前で、64ビット環境のint(32)なら
参照は 64ビット&参照する処理が必要
値渡しなら 32ビットで参照処理不要
*/
// もちろん上記の配列ではなく変数バージョンも同じくむり
// 結果 hey
$value = 'hey';
$ref = &$value;
unset($ref);
print_r($value);
// call_user_func は リフレクションのような関数ポインタのようなもの
// ただし、参照を引数に渡すことは出来ない
// なぜなら、call_user_funcの定義自体は参照を引数としないため
// 公式の裏技がある
function takeshi(&$str) {
$str = '武';
}
// 武 と出力される事を期待するが、参照ではなく値渡しになっているので さくらこ のまま
// よくよく考えればしかたないこと call_user_funcの定義自体は参照を引数としないため
$str = 'さくらこ';
call_user_func('takeshi', $str);
print $str;
// こちらを使用すると可能
// 武 と出力される
// なぜこれが可能かというと、call_user_func_arrayに渡しているのは 値 だから
// そして、その値である array が参照を持っているだけ
// ただ、そのarrayに参照を格納することを明示的にしなければいけないので &$str とする
$str = 'さくらこ';
call_user_func_array('takeshi', array(&$str));
print $str;
?>