Help us understand the problem. What is going on with this article?

JavaからPHPに入った人が これってどうなんだろう って思う部分。 その1

More than 3 years have passed since last update.

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;

?>
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away