さまざまな言語仕様について熱く語る闘技場
つうかググればすぐ言及するページは見つかる。やっぱりcopy on write だ。 Big arrays in PHP http://brian.moonspot.net/2007/02/28/big-arrays-in-php/ > If the array is static then you don't really have to assign it by > reference, since in PHP 5 all (non-object) variables are > copy-on-write. So as long as you don't change the value then a copy > isn't made. php.netにはどこに書いてあるのか分からん。バグレポートばかり引っかかる。 この辺の挙動はパフォーマンスに重大な影響を与えるのに、公式ドキュメント には記述が見つからん。たぶん書いてないんだろう。 ライブラリの記述はそこそこだが言語仕様の記述は貧弱。こういうのがPHPの一 番直してほしいところだな。 >>148 落ち着け。145は別の話だ。 そっちの話は143が説明できないようだが。 Amazon.co.jp: はじめてのPHP言語プログラミング入門: 大垣 靖男: 本 http://www.amazon.co.jp/dp/4774122866 どうやらこの本がおすすめらしい。 PHPの言語仕様についてきちんと扱った本だという。 ,j;;;;;j,. ---一、 ` ―--‐、_ l;;;;;; {;;;;;;ゝ T辷iフ i f'辷jァ !i;;;;; ヾ;;;ハ ノ .::!lリ;;r゙ 在日の方々はかわいそうな強制連行の被害者 `Z;i 〈.,_..,. ノ;;;;;;;;> ,;ぇハ、 、_,.ー-、_',. ,f゙: Y;;f そんなふうに考えていた時期が 〜''戈ヽ `二´ r'´:::. `! 俺にもありました 最近、個人的に面白いと思った言語仕様があるのだが、ここに書いてる時間が ないし、書いても長くてウザがられそうなので、クイズにしてみる。 「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 のリンク先の記事 http://www.phppro.jp/news/304 が正しいかどうか、 問題があるとしたらどこか、考えてみよう。 >>161 おお、やっと大垣さんの名前を知っている人が来たか。 よかったら>>159 の問題を見てってくれ。 誰にもやってもらえなくてさびしい。 つうか、PHPのリファレンスって、要するにインスタンスに別名をつけることで、 仕組み自体はきわめて単純なものなんだよな。他言語で一般に言われるリファ レンスと似ても似つかないだけで(俺だったら「エイリアス」とか命名したと 思う)。 わかりにくいのは、なんでPHPはこんな、他言語にはない奇妙な仕組みを必要と するかだ。PHPのリファレンスはいつ、どのようなときに必要なのか。それを理 解するには、PHPの変数と各種インスタンスの挙動を理解する必要がある。 >>159 のクイズは、まさにその辺の問題を扱っている。まあちょっと再帰を絡ま せてしまったんで分かりにくくなってしまったが、再帰は枝葉で、本題にした いのはそっちだ。 >>162 その問題、最初に出現したときに解いて、全問正解だったよ。 でもそんなこと書いたって意味ないから書かなかっただけ。 いろんなところにコピペしなくていいよ。 参照でおもしろいのは、引数を参照で受け取る関数で、 それがオブジェクトであることを期待してるのに、NULLだった場合とかに、 関数の中で何もしないのに、var_dumpすると再帰になるようなスクリプトで 別のメモリ領域にズレが生じるとか。 >>164 ちょっと待て。これどこかにコピペされてんの? 俺はここと、くだ質スレ79にしか書き込んでないぞ。 まあそんなことはどうでもいいか。 全問正解とはすごいな。俺自身、Q1の最後から2番目は、自分でも動かしてみな いと分からんかった。 どうやって勉強した?PHPマニュアルだけでは>>159 は分からんと思うが。 参考にさせてほしい。 あとQ2の答えを、手短でいいから書いてみてくれないか? >>165 > 関数の中で何もしないのに、var_dumpすると再帰になるようなスクリプトで すまんがここの意味が分からん。 なんかコードの実例で示してもらえんか? >>166 参照代入を行った場合のrefcountが違う 俺も大垣先生の本は分かりやすいと思った。 PHP6が出たら、改訂版の投入をお願いします!>< 図書館で借りて読むけどw echo と print の厳密な違いを教えてください 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); } >>177 echo は、(カンマ)で区切って、連続で引数をぶちこめる。 printはできない。 そうなるとprintなんて必要ないよな 配布スクリプトなんか覗くとprint使ってるやつがいるので不思議でたまらない printは成功すると1を返す。 echoは何も返さない。 $a=1; $a ? echo 'aaa' : echo 'bbb'; //error $a ? print 'aaa' : print 'bbb'; //ok システムハンガリアンって評判悪いじゃん。 たしかにC++みたいに型が違う値を代入しようとしたら 速攻でエラー吐くコンパイラにかけるんなら意味ないかと思うけど、 PHPみたいに元の型が何であろうが無視して新しい型にしてくれちゃう言語は、 ひるがえって『単なる型名を変数名につける』ってのが有効じゃないかと思うんだ。 PHPにおいてはアプリケーションハンガリアンよりシステムハンガリアンのほうがいい気がしてる。 ハンガリアンに限らず、PHPの柔軟すぎる型変換に適した命名規約を考えてくれ。 そもそも、ハンガリアンが嫌われているのは 変数に実際に入れる型がいろいろ変わるからなわけだが。 >>185 はバグ回避のために違う型を入れないようにするためと いっているのだと思うが、間違った型を入れるとか言う以前に ソフトウェアの性質上、型は変わるものなんだよ。 (変数に最初に想定していた型以外のものを入れることになる) 時代の流れとともに16bit変数は32bit変数に変わるし、 32bitポインタは64bitポインタに変わるし、 オブジェクト指向言語なら、型は継承され新しい型になる。 PHPのような柔軟な言語だからこそ、なおさらハンガリアンは必要ない。 それにハンガリアン(変数の頭に型を入れる)を使うまでもなく 変数名そのものが型をあらわしている。flagならtrue/falseだし、priceなら数値だろう。 >>185 flagがビットフラグ(整数)だったり priceが税計算機能つきのItemPriceクラスのオブジェクトだったらどうすんの? 常識の範囲内ならどうでもいい。 つまりは、priceがlongからItemPriceに変わるというように 型が変わることがあるってこった。 それは避けられないからハンガリアンはよくない。 クラスでゲッターやセッター使ってれば タイプヒンティングも使えるし、型よりも値の範囲を絞って 例外を飛ばせるから全く問題ない。 一度処理に入ったら長い処理が行われるのではなくて 1回毎のシンプルな処理をセッションやクッキー使ってどうにか 継続させるのがWebアプリだから、ユーザー側のデータは 1回毎に改変が無いか毎回チェックする事になるし、型があってもなくても関係ない。 >>190 議論はここでおk 無駄なスレは使わなくておk Mono最強伝説 http://ja.wikipedia.org/wiki/XSP_ (Web%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC) システムハンガリアン病だわ・・・ HTMLでさえも<span id="spanHoge">とか<input type="text" name="txtHoge">とか しないと気が済まない_| ̄|○ 誰でも簡単にネットで稼げる方法など 参考までに、 ⇒ 『半藤のブブイウイウレレ』 というサイトで見ることができます。 グーグル検索⇒『半藤のブブイウイウレレ』 L32JIAVAJE ウム(メ▼▼)y-i_(・o・ ;)オヤブンドウゾ!! read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる