09/01/11 18:25:25
最近、個人的に面白いと思った言語仕様があるのだが、ここに書いてる時間が
ないし、書いても長くてウザがられそうなので、クイズにしてみる。
「PHP言語仕様・力試しクイズ」
$ php -r '$a=array(); $a["a"]= $a; var_dump($a);'
$ php -r '$a=array(); $a["a"]=&$a; var_dump($a);'
$ php -r '$a=new stdClass; $a->a= $a; var_dump($a);'
$ php -r '$a=new stdClass; $a->a=&$a; var_dump($a);'
(以下は PHP5(以上)でしか動かない)
$ php -r '$a=new stdClass; $a->a= clone $a; var_dump($a);'
$ php -r '$a=new ArrayObject(array()); $a["a"]= $a; var_dump($a);'
$ php -r '$a=new ArrayObject(array()); $a["a"]=&$a; var_dump($a);'
$ php -r '$a=new ArrayObject(array()); $a["a"]= clone $a; var_dump($a);'
Q1
これらのコードが、PHP4とPHP5で、それぞれどのような表示をするか、試して
みよう。自信のある人は試す前に予想してみよう。
Q2
>>144のリンク先の記事 URLリンク(www.phppro.jp) が正しいかどうか、
問題があるとしたらどこか、考えてみよう。
160:nobodyさん
09/01/14 17:15:05
>>153
作者乙
161:nobodyさん
09/01/14 18:06:09
大垣センセがこんなとこくるわけないだろw
162:nobodyさん
09/01/14 18:38:30
>>161
おお、やっと大垣さんの名前を知っている人が来たか。
よかったら>>159の問題を見てってくれ。
誰にもやってもらえなくてさびしい。
163:nobodyさん
09/01/14 18:53:26
つうか、PHPのリファレンスって、要するにインスタンスに別名をつけることで、
仕組み自体はきわめて単純なものなんだよな。他言語で一般に言われるリファ
レンスと似ても似つかないだけで(俺だったら「エイリアス」とか命名したと
思う)。
わかりにくいのは、なんでPHPはこんな、他言語にはない奇妙な仕組みを必要と
するかだ。PHPのリファレンスはいつ、どのようなときに必要なのか。それを理
解するには、PHPの変数と各種インスタンスの挙動を理解する必要がある。
>>159のクイズは、まさにその辺の問題を扱っている。まあちょっと再帰を絡ま
せてしまったんで分かりにくくなってしまったが、再帰は枝葉で、本題にした
いのはそっちだ。
164:nobodyさん
09/01/14 18:59:55
>>162
その問題、最初に出現したときに解いて、全問正解だったよ。
でもそんなこと書いたって意味ないから書かなかっただけ。
いろんなところにコピペしなくていいよ。
165:nobodyさん
09/01/14 19:05:36
参照でおもしろいのは、引数を参照で受け取る関数で、
それがオブジェクトであることを期待してるのに、NULLだった場合とかに、
関数の中で何もしないのに、var_dumpすると再帰になるようなスクリプトで
別のメモリ領域にズレが生じるとか。
166:nobodyさん
09/01/14 19:09:11
>>164
ちょっと待て。これどこかにコピペされてんの?
俺はここと、くだ質スレ79にしか書き込んでないぞ。
まあそんなことはどうでもいいか。
全問正解とはすごいな。俺自身、Q1の最後から2番目は、自分でも動かしてみな
いと分からんかった。
どうやって勉強した?PHPマニュアルだけでは>>159は分からんと思うが。
参考にさせてほしい。
あとQ2の答えを、手短でいいから書いてみてくれないか?
167:nobodyさん
09/01/14 19:13:09
君見苦しいぞ
168:nobodyさん
09/01/14 19:13:20
>>165
> 関数の中で何もしないのに、var_dumpすると再帰になるようなスクリプトで
すまんがここの意味が分からん。
なんかコードの実例で示してもらえんか?
169:nobodyさん
09/01/14 19:17:29
>>167
意味不明。
170:nobodyさん
09/01/14 19:42:19
>>166
参照代入を行った場合のrefcountが違う
171:nobodyさん
09/01/14 22:04:23
見苦しい人がちょっといたほうが盛り上がるよ
172:nobodyさん
09/01/14 22:17:55
盛り下がっちゃったわけだが
173:nobodyさん
09/01/17 07:18:25
>>159
Q2の答えまだ~?
174:nobodyさん
09/02/08 20:48:24
緊急浮上あげ
175:nobodyさん
09/02/09 02:15:47
俺も大垣先生の本は分かりやすいと思った。
PHP6が出たら、改訂版の投入をお願いします!><
図書館で借りて読むけどw
176:nobodyさん
09/02/09 11:41:42
本人乙
177:nobodyさん
09/02/09 14:13:32
echo と print の厳密な違いを教えてください
178:nobodyさん
09/02/09 14:46:33
void zend_do_print(znode *result, znode *arg TSRMLS_DC)
{
zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
opline->result.op_type = IS_TMP_VAR;
opline->result.u.var = get_temporary_variable(CG(active_op_array));
opline->opcode = ZEND_PRINT;
opline->op1 = *arg;
SET_UNUSED(opline->op2);
*result = opline->result;
}
void zend_do_echo(znode *arg TSRMLS_DC)
{
zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
opline->opcode = ZEND_ECHO;
opline->op1 = *arg;
SET_UNUSED(opline->op2);
}
179:nobodyさん
09/02/09 20:41:25
>>177
echo は、(カンマ)で区切って、連続で引数をぶちこめる。
printはできない。
180:nobodyさん
09/02/09 20:49:46
そうなるとprintなんて必要ないよな
配布スクリプトなんか覗くとprint使ってるやつがいるので不思議でたまらない
181:nobodyさん
09/02/09 21:10:42
printは成功すると1を返す。
echoは何も返さない。
182:nobodyさん
09/02/09 23:30:44
$a=1;
$a ? echo 'aaa' : echo 'bbb'; //error
$a ? print 'aaa' : print 'bbb'; //ok
183:nobodyさん
09/02/10 05:47:16
三項演算子の場合普通式の先頭から書かないか?
184:nobodyさん
09/02/10 06:33:49
一例ってことで