さまざまな言語仕様について熱く語る闘技場
配列を作るたびに、いちいち array って、書かないといけないの、なんとかならないの? perlだったら、 @a=(1,2,3,4,5); これで、すぐに配列作れるのに。 なんで、いちいち、arrayとかって、 言ってあげないとわからないの? それと、配列のくせに、シジルが$なのも むかつきます。納得できません。 無知乙 関数ですよ キミはperlから入ってきたからPHPの仕様をよく知らないようだ >>6 無知な君のために証拠を見せてあげてもいいが、 見せてくれって頼まれてもいないのに見せたんじゃ、 知恵の押し売りになっちまうからな。 結論だけ。 システム仕様としてPHPのarrayは関数ではありません。 popって、配列関係の関数に決まってるのに、なんで いちいち、わざわざ array_pop とかって、「array」を接頭辞につけるの? pop、だけで十分、意味がわかるし、通じるじゃん。 実際、perlでは、「pop」だけで世の中回ってるよ? arrayは特殊ではあるが関数だよ 因みにissetやemptyは関数じゃない >>11 システム内で関数として定義されていると考えてよいの? システム内では関数ではないが、関数っぽい動作するから関数として考えてもいいっていう文脈ではなくて? なにやら混乱があるようだけど、 array() は関数ではないよ。echo などと同 様、言語構成要素の一つ。 array($x, $y,) のように、array()は最後の引数のあとにも , を置くことがで きる。 http://jp.php.net/manual/ja/function.array.php これは、array()の評価のされ方が、関数と同じではないことを示している。一 般のユーザがPHPやCで関数を書いて、array()と同じ挙動をさせることはできな い。このことから明らかに、array()はPHPの構文解析器そのものに組み込まれ た言語構成要素。 また array()はコールバックとして他の関数に与えることもできない。 http://jp.php.net/manual/ja/language.pseudo-types.php これもやはり、 array()が関数ではなく言語構成要素だから。LISPで言えば、 高階関数にスペシャルフォームを与えることはできないのと同じ。 >>9 > popって、配列関係の関数に決まってるのに、なんで > いちいち、わざわざ > array_pop > とかって、「array」を接頭辞につけるの? それはたぶん、PHPに名前空間がなかったから。 Perlにはパッケージがある。 >>14 言語構成要素の1つではあるが何故関数で無いと言いきれるんだ? arrayの注意点にはこうある 注意: array()は、実際にはリテラル配列を表現するための 言語構成要素であり、通常の関数ではありません。 echoやissetはこうだ 注意: これは、関数ではなく言語構造のため、可変関数 を用いてコールすることはできません。 arrayは言語構成要素の1つではあるが 言語構造では無く特殊な関数と言うことじゃねぇの? ここらへんの説明よろしく >>14 言語構成要素の1つではあるが何故関数で無いと言いきれるんだ? arrayの注意点にはこうある 注意: array()は、実際にはリテラル配列を表現するための 言語構成要素であり、通常の関数ではありません。 echoやissetはこうだ 注意: これは、関数ではなく言語構造のため、可変関数 を用いてコールすることはできません。 arrayは言語構成要素の1つではあるが 言語構造では無く特殊な関数と言うことじゃねぇの? ここらへんの説明よろしく なんか改行が変になったので再 >>17 すまんが問われている意図がいまいちよくわからん。 逆に問い返させてくれ。 1. 「特殊な関数」って何だ?array()がその一つだと考えていることは分かっ たが、他にはどんなのがある? 自分の考えでは、PHPには「特殊な関数」というカテゴリはない。関数か、そう でないかだ。 で、関数かどうかは、「関数のように評価され実行されるもの」が関数だ。 array()は、構文解析器に備わった、関数を評価する汎用的な仕組みでは評価で きないから関数ではない。 array()を評価するためには、構文解析器にarray()専用の仕組みが必要だ。 2. 「言語構成要素」と「言語構造」の違いは何だ?PHPではどれが言語構成要 素で、どれが言語構造なんだ? 自分の考えでは、この二者に違いはない。いずれも、構文解析器に専用の仕組 みを必要とするものだ。 もしかしたらいるかもしれない外野のために補足すると、自分はLISPの、関数 とスペシャルフォーム(特殊形式)の解析方法の違いを念頭に置いて書いている。 そんな遠まわしに書かなくても、すっきり明快な答えの出し方がある。 もうすこし、関数を勉強してくれ、諸君。 そんな些細な言葉の違いを言うなら原文ではどっちもlanguage construct。 パーサトークンであり構文。 http://jp.php.net/manual/ja/tokens.php 注釈が違うのはそもそも何かを処理するものでもない arrayを可変コールすることなんざまずないからじゃね。 >>20 すまんがどっちを批判しているのか分からんかった。自分はSICPとか読んでる けど、まだ分かってかもと不安になっちゃったよ。 しかし、普通のプログラマが「関数」という概念そのものを勉強するメリットっ て、なかなか見えないだろうし、見えないと勉強しないと思うんだが。 >>21 おお、なんと明快な答えだ! 原文と、パーサトークンの一覧ページに当たれば、一目瞭然だな。 実はPHPの経験は浅いので、パーサトークンのページは知らなかった。ありがとう。 >>18 > 自分の考えでは、PHPには「特殊な関数」というカテゴリはない。 > 関数か、そうでないかだ。 特殊関数 つ ttp://jp.php.net/manual/ja/language.oop.magic-functions.php >>22 どちらか片方を批判してるわけじゃない。 簡単に結論が出る内容を、よくわかってない者同士が、状況証拠を 並べ立ててワーギャーやってるので、書いてみた >>23 なんだ、特殊関数という用語があるのか。 しかしそれはぜんぜん文脈が違う。__sleepや__wakeupは、特定の機会に必ずコー ルされるというだけで、評価の仕組み自体は通常の関数となんら変わらない。 >>24 それは失礼した。また恥をかいてしまったが、あなたのおかげで勉強になりま した。ありがとう。 >>25 おれは何も勉強させたつもりはないし、有用な情報は提示していないが? 特殊関数といっても、普通はマジックメソッドってみんな言ってるやつを 訳者が特殊関数って書いてるだけだと思う。 だからどうということはないが。 >>26 まあ勝手に感謝されたら気持ちが悪いかもしれないが、情報の価値はその受け 手が決めるもんです。PHP入門者の自分はまさにその情報を欲していた。 つうかあなたが「くだ質」スレに登場してたら、話は早かったのになあ。 http://pc11.2ch.net/test/read.cgi/php/1226517332/961- http://pc11.2ch.net/test/read.cgi/php/1228667259/13-27 まあ自分はあっちのスレには書いてないけど。 マジックメソッドについては分かってる。今度は原文をちゃんと読んだし。 >>27 理解したのなら俺にどちらなのか教えてくれ もし関数でなく言語構造というのであれば 何故態々”通常の”関数ではありません。 と書いてあるのか >>28 うん、関数ではなくて言語構造。>>21 氏のとおり、パーサトークン一覧に載っ ているから明らか。 "通常の" 関数(regular function) と書いている理由は分からんけど、自分は これは、通常の関数のほかに特殊な関数があるのではなくて、関数というもの は(みんな)通常、arrayは関数でない特殊なもの、と書いてるだけだと思う。 >>29 特殊な物なら何故通常のと態々つけるの? echoやincludeも()つけて書けて関数のような形に見えるけど それぞれの説明にちゃんと言語構造ですと書いてあり通常のとは書いて無いよ? >>30 でも>>29 のように、関数を通常、関数以外を特殊という読解もできるよね? もちろんあなたの言うようにも読める。原文の記述があいまいなんだよ。 で、決定的根拠は>>21 。 日本語訳した野郎の勝手な解釈が含まれてるってことだお [arrayは言語構造なの!] 攻撃:95 素早さ:40 防御:37 命中:83 運:43 HP:200 [arrayは関数だゴルァ!] 攻撃:28 素早さ:65 防御:37 命中:52 運:21 HP:163 arrayは言語構造なの! vs arrayは関数だゴルァ! 戦闘開始!! [arrayは関数だゴルァ!]の攻撃 HIT [arrayは言語構造なの!]は1のダメージを受けた。 [arrayは言語構造なの!]の攻撃 HIT [arrayは関数だゴルァ!]は169のダメージを受けた。 [arrayは言語構造なの!]が[arrayは関数だゴルァ!]を倒しました(ラウンド数:1)。 いや、原文があいまい。訳者は責められんと思う。 > Note: array() is a language construct used to represent literal > arrays, and not a regular function. >>31 関数以外を特殊と言うのであれば 何故issetやemptyあとlist等に通常と言う言葉が無いのさ arrayだけ別の表現をする意味が無いよね しかもだ 言語構成要素であり、通常の関数ではありません。 と言語構成要素という言葉があるの通常の関数ではないと 態々関数だけど特殊だよという風な書き方をしている >>33 ...。 あんまり勝負って考え方は好きじゃないなあ。 みんなが正しい結論に到達して、みんなが得した、と考える方がよくない? まあスレタイ通りではあるけど。 >>35 だからそれはPHPマニュアルの表記の不備だろうってば。 つうか、array はパーサトークンの一つだと>>21 で示されて、それでも状況証 拠を主張し続ける理由が分からない。 パーサトークンという言葉だけでは、あなたは納得できない? 顔真っ赤にして http://pc11.2ch.net/test/read.cgi/php/1226517332/961 を否定してた奴涙目? 961の時点で正解出てるのに土曜日から今までほんとに何やってんだ 言語構造か関数かは元のソースコードを見て判断するしかないだろ >>38 そういう言い方よくないと思うよ。彼(彼女)をきちんと納得させられないな ら、むしろ自分たちがダメなんだと思う。 >>39 それは違う。ソースを読んだって、>>21 と同じ情報が得られるだけだろう。 だめなのは無知なのに理由もなく一方の主張を崩さず納得しない方だろ 疑問に思うなら自分で調べりゃいいのに >>37 できないかな >>17 に戻るけど 言語構成要素の1つではあるが何故関数で無いと言いきれるんだ? 言語構造の一部である事はマニュアルにも"言語構成要素であり"と書かれている これらの原因がただ単にマニュアルの不備が原因である とは考えにくいよ・・・ もしarrayのマニュアルがarrayが出来てから 更新されていないというのであればそれも有りえるだろうけど >>41 貴様もよく知らないくせに罵倒だけは一人前だなwwwwww パーサトークンという言葉を説明すればいいのかと思ってググったが、 PHPマニュアルばかり引っかかって、自分涙目。 弱ったな。どこかに分かりやすい説明ない?(他力本願) 自分はLISPのごく簡単な処理系を作ってみる以外の方法を思いつかないが、 あまりにも非現実的すぎる。 ここで納得してもらうためだけに最低限必要な知識ってなんだろう。 さてと、パーサートークンなんてのは傍証に過ぎない。 なぜなら、パーサートークンかつ関数な特殊な関数である可能性を否定できないから。 しかし、おれはもっと確実にわかる方法を知っている。 もう少し、勉強したらいいよ諸君。 わかる方法を書いてくれないかな 知ったかなんていらねーんだよ >>45 > なぜなら、パーサートークンかつ関数な特殊な関数である可能性を否定できないから。 えー、そういう話なの? 演算子はトークンだけど、実際には関数が割り当てられている、みたいな? ここで問題になってるのは構文解析で、実装はまた別の話だと思ってたよ。 > しかし、おれはもっと確実にわかる方法を知っている。 > もう少し、勉強したらいいよ諸君。 勉強はがんばりますので、どうか教えてください。 構文解析の話に絞ったのは君のハンドリングに過ぎない 45はロジックとして証明にならないといっているだけ システム上のことはコードで確認する。 文理上のことはドキュメントで確認するのが道理。 結局のところ、話のレイヤーが違うってことだよな。 ドキュメント上は関数に分類されてて明確に否定されてないので関数であると考えるのが妥当。 ドキュメントはいろんな要件で書かれるからレイヤーの違いを理解できない人がいても仕方ないか。 システム上は判定一つ書けば結論でるしな。あれとか、それとか。 で、システム上はこうよ try { ReflectionFunction::export("array"); } catch(Exception $e) { echo $e->getMessage(); } ま、function_existsで調べればtrue falseで返してくれるわけだけど。 >>51 高木さんじゃなくて、大垣さんのほうが確実 ドキュメントもバグレポート出せば変わるから、 変わったその日から名実ともに関数じゃなくなるだろうね。 しかし、このルーズさというか曖昧さがPHPのいいところ 関数でも式でもないっていったって、言語構造っていったって、 if (include("test.php"))のreturnの扱いとか、特殊としか言いようがない。 めんどくさいから海外のMLとに投稿したり開発元にメールして聞いてみたらいいんじゃないの そろそろ結論でたでしょ。 ・言語解析上は、array()はT_ARRAYであって、T_FUNCTIONではない。 ・一般に関数とは、引数が与えられて一定の結果を返すものという意味では関数 ・ドキュメント上では関数に分類されているが、T_FUNCTIONではないという注釈がつく ・パーサートークンの中には式(≒関数)として評価されるものがいくつかある。 ・中でもarrayは関数的性質が強い。(副作用が少なく線形写像的) ・よって、ドキュメント上の表記に差異がある。 結論は各自が導きだせばよい 例1)array()は言語解析上は関数ではないが、一般論的には関数に分類される。 例2)array()は広義では関数だが、厳密には関数ではない。 例3)PHPの話をするなら言語解析だけで十分なので関数ではない。 などなど。 事情を分かった上であれば、害はない。 お、そうかい? > 結論は各自が導きだせばよい 結論 = f(事情); fの定義によって結論が変わるというのがこの現象のすべてで その例を出せば十分だろう。 echoが文字を出力するという結論に代わりがないように arrayもだせよ おいおい > echoが文字を出力する それは何の結論なんだよ 例1 echoは文字を出力する 例2 echoは配列をarrayと出力する 例3 echoはカンマで区切って出力できる 例4 if (echo("hoge")) print("hoge");はパースエラー PHPに文句あるなら、言う相手は開発元のZendだろ? ここでグダグダ言っても、Zendには声が届かない。 …と思ったが、参考になりました^^ zendって開発元だったの? スポンサーじゃなかったっけ? perlってオープンソースなの? perlがオープンソースだから PHPをカンタンに作れたの? まぁ、PerlがPHPやJSPのようにHTMLソースのインラインで実行できたら、 まぁ、もっと初心者を取り込めたかもしれないねぇ。 まぁ、CPANの仕組みをもう少し落ち着いて考えたらよかったかもねぇ。 まぁ、そうならなくてよかったと思ってるPerlerは多いかもしれないけど、 まぁ、・・・ なんか詳しい人が多そうなので、聞いてみたいことがある。 PHPって、存在しないプロパティに値を代入すると、その場でプロパティが生ま れるよね? php -r '$hoge = new stdClass; $hoge->fuga = "ふがふが\n"; echo $hoge->fuga;' => ふがふが これってPHPマニュアルのどこに書いてあるの? オーバーロードの説明は読んだ。__set()の説明はあったけど、__set()の中身 が何もないデフォルトの場合の挙動の説明は見つけられなかった。 おかげでずっと、新しいプロパティが生まれていることに気づかなかった。 >>70 くだ質にはちょっと前に同じ質問がされてたんだよ。しかし回答はなかった。 たぶんPHPマニュアルには載ってないんだろう。 この辺の挙動を知っておかないとオーバーロードは理解できないのに、PHPマニュ アルには載ってないんだとしたら、詳しい人たちはどうやってこれを知って理 解したのか聞きたいんだよ。 ちなみにPHPマニュアルのページ下のコメント欄みたいなところには載ってた。 しかしあそこはホントに玉石混交で、あそこにだけ載ってても意味ないだろ。 >>72 今見てみたら、前スレの470だった。 http://pc11.2ch.net/test/read.cgi/php/1226517332/470 いろいろやり取りしてたけど、結局PHPマニュアルの当該URLは出てない。 >>74 違うってよ。俺は__set()がユーザによって定義されてない、素のオブジェクト の挙動の話をしてんの。>>69 のコード読んでよ。これはPHP4でも動くんだよ。 そのリンク先のは、 > $obj->a = 1; > echo $obj->a . "\n\n"; とかやってるけど、これは全部PHP5以降の __set()と__get()が呼ばれてるだろ。 >>76 おお、ありがとう。しかしこれ微妙に違うんじゃね? これは 1.「未定義の変数をクラスとして扱うとstdClassのインスタンスになる」 ことの説明であって、 2.「任意のインスタンスは、未定義のプロパティをセットできる」 ことの説明じゃないだろ? もちろん2.を前提として1.が説明されているわけだけど、2.そのものの説明は どっかにないの? つうか、このオブジェクトの挙動について、元々知ってた人はどのくらいいる? いるとしたら、どうやって知った? これをPHPマニュアル読んで知った人って、一人でもいる? おお!勉強になります!もっとやれ!!!…いや、みんなで考えよう(・∀・) 憶測: PHPの由来はHTML文書中で簡単に<?php echo $hoge;?>するのが目的だったので、 変数は宣言せず、最初に代入等がおおなわれた時に作成される。 というのが基本仕様で、昔のマニュアルでは見かけたことがある。 これは、現在のマニュアルの「変数」のページにも PHPでは変数を初期化する必要はないが、という控えめな表現で触れてある。 PHP4で導入されたクラス・オブジェクトでもそのことは変わらず、 メンバー変数の宣言はできるものの、実際のところ、代入によって 変数が育成されるという仕様に変更はなかった。 PHP5になって、public,protected,privateの区別を宣言できるようになったが、 宣言がない、もしくはvarで宣言された場合、PHP4互換となる。 また、PHP5ではクラス用のマジックメソッドが用意された。 これにより、宣言していないメンバー変数に対してオブジェクトからアクセスすると、 メンバー変数が作られるという"仕様"が結果的に発生する。 しかし、制御したい場合は__setでreturn null;なり例外を発生させることで、 宣言していないメンバー変数を使わせないというシステム仕様は実現できるので、 特に不自由することはない。 おもしろいのは、前者の仕様で運用すると、同じクラスから発生したオブジェクトなのに、 なのに、メンバー変数一覧に差異が生じ、get_object_varsでクエリを自動育成などを やろうとすると、不具合の原因になるが、それは仕様の乱用と考えるのが妥当か。 ながーい、憶測ですんまそん。 >PHPの由来はHTML文書中で簡単に<?php echo $hoge;?>するのが目的だったので、 >変数は宣言せず、最初に代入等がおおなわれた時に作成される。 <?php echo $hoge;?>これのどこが代入なんだ? >>83 > <?php echo $hoge;?>これのどこが代入なんだ? どこに、それが代入だって書いてある? 変数宣言必須なコンパイラ環境でのリテラシーを持たないやつには、 インタプリタ環境での変数動的割り当てによる収穫について理解するのは難しい。 みんなが使ってみたプログラミング言語は? じゃあ、俺から。 C→Perl→Java→PHP→SQL→JavaScript→Excel VBA 次は、ActionScriptを勉強したいです。 >>87 ひどい順番だなw SQLを使わずにJavaでなにやってんだかw 何一つ習得できなかったとかいう落ちはやめてくれよな JS使えてればASなんて勉強するまでもない。 >>88 プログラムは、「データ」とデータの「処理」から成り立っている。 一応SQLでも、処理(条件分岐とか)が書けるんだよね。 cf.日経ソフトウエア 2008年 03月号 p.55 分類/基礎となる計算モデル/事例 手続き型言語/チューリングマシン/C, Java 問い合わせ言語(非手続き型言語)/関係モデル/SQL 関数型言語(非手続き型言語)/ラムダ計算/Lisp, Haskell 論理型言語(非手続き型言語)/一階述語言語/Prolog こういう知識って、学校の授業で勉強する場合は、計算科学やソフトウェア工学という科目で習うのかな? そんなんプログラミングするなら中学生にだって基礎知識だろ >>89 Javaはオブジェクト指向の教材として役立ちました! …しょぼいアプレットが作れます>< ActionScript → Flash、Flex、AIRでWEBアプリを作る 広がる妄想(アイデア)が実現できれば、手段(プログラム言語)は何でもいいんだけど^^ 今の高校は「情報」という授業があるらしいね。 http://www.mext.go.jp/a_menu/shotou/zyouhou/main18_a2.htm =このスレのネタみたいに、関数がどうとか熱く語り合っているのかな? 量子コンピューターの設計とか、プログラミング言語をデザインするとか、 スーパーハッカーみたいな中学生ばかりだったら、技術立国日本の未来は明るいwww Simple is best. 簡単にできることを複雑にやる必要はない。 =WEBアプリなら、既存の資産を活かしてPerl、PHPで十分 C、アセンブラのおかげで、ハードの仕組みが理解できるようになった。 Javaのおかげで、オブジェクト指向の話が理解できるようになった。 WEBプログラミングのおかげで、サーバー、ネットワークの話が理解できるようになった。 <今後の課題> 1.デザインパターンのマスター 2.LISPやScheme等の関数型言語をマスター 3.将来実用化されるであろう量子コンピューターについて予習しておく WEBアプリが自由自在に作れるようになったら、小遣い稼ぎのPHPは卒業だな!(・∀・) 量子コンピューターってプログラミング言語っていうレイヤーじゃないよな? おれはPHPのかたわら、Haskellで遊んでみたけど、目から鱗。 PHPコードも洗練されてくるからおもしろい。 マスターとか言ってる奴がまともな技術と知識を持ってたためしがない 俺が最初に覚えた言語はHTML。 その中でも、<body>に関しちゃ、ネイティブ?って言われることがある このまま糞スレ化→dat落ちさせるのは惜しいな。 PHPの言語仕様について話し合える場所は少ない。 安心していいよ、このスレは残る 消えるのはお前だけだから HTMLは高級言語って話は聞いたことあるけどCSSって言語? echoとprintは文字を出力することは同じなのに なんで二つも同じことができるんですか? CSSも、関数やらロジックを実装するようになってきたからなぁ。 叙事詩的定義もなにか新しいプログラミング言語のように感じる >>111 CSSの関数ってのはググったら見つかったけど、 例)CSS//関数 http://suika.fam.cx/ ~wakaba/wiki/sw/n/CSS++%E9%96%A2%E6%95%B0 > 叙事詩的定義 ってのはぜんぜん見つからない。"epic(al) definition" でも該当なし。 詳細プリーズ。 短文煽りは不快なだけで何も生み出さないからやめようぜ。 そのうち Kusakabe (void) みたいになっちまうぞ。 >>113-114 はストレスたまっててここで発散したいんです! >>106 に遅レス。 なんで echo と print の二つがあるかというと、まあ以下の文書に解説がある わけだけど、 FAQTs - Knowledge Base - View Entry - What is the difference between echo and print? http://www.faqts.com/knowledge_base/view.phtml/aid/1/fid/40 どうも読んでてまだるっこしい。 2番目とか、 「echo は文(statement)、printは式(expression)」 こう書いたら、ずっとスッキリすると思うんだが。 そういう専門用語を使いたくないのかもしれないが、statement やexpression 程度の簡単な概念すら避けて説明するのは間違っていると思う。 これは外部リンクだけど、PHPマニュアルは全体的にそんな印象。 >>118 さすがに張本人は分かってなきゃ作れないだろ。 単にユーザへの説明の仕方の問題だと思う。 英語ができたらなあ。自然言語を書くのはは難しい...。 プログラミングと英語はほとんど同じような気が・・・ そうかあ?自然言語は理詰めで書けないじゃないか。 文法だけ覚えても engrish.com に載るような英文しか書けない。 PG言語も文法だけ覚えてもサンプルに載ってるような英文しか書けない。 if (i = no money) {you are ogottekureru me}else{you are keti} 俺は英語ができると思ったことはないな。 一応、片言で会話したり、英語のドキュメントも 英文サイトは普通に読めるから不自由はしないけど、 英語で恋愛はできんw いや今話してるのは メーリングリストに投稿するとか その程度のレベルの話だから。 お、そうか、>>120 からの流れね。数レス前も読まずに書いて寸摩損 どうやってMLに入会するのかもわからない 普通に申請するだけじゃだめみたいね 英語がわからないから入会方法がわからないって捉えられないとかゆとりですか? OK! well, let's talk in English here. このスレを見ている人はこんなスレも見ています。(ver 0.20) pixiv自前イラスト向上スレ part7 [CG] 【ショタ】3次専ショタスレ 10【女装・美少年】 [Download] ... what are you interested in ? (^^; 俺はセンターで9割近くは取ったが、いまだに英語ができる気がしない。 All your base are belong to us - Wikipedia http://ja.wikipedia.org/wiki/All_your_base_are_belong_to_us これも解説を読まなきゃ分からんかった。 英語のオンラインゲームできれば 「英語できる」と認定していいと思う I try to write the comment on program code from yesterday. It's cooooool!!! ;-p 「phpできます!」なんて自信たっぷりに言われた時の恥ずかしさ - ドグマを探しに http://d.hatena.ne.jp/crenlif/20081114/1226660315 > PHPのあれが駄目とかじゃなく、もし神様(何の?)が、今までのは無かった > ことにしてPHPをどこでも3ヶ所直していいよっていったらどうするかっての > を聞いてみたいです。 具体的な内容はリンク先を参照。この辺ほんとに直らんものかなあ。 別の話。 PHPでの内部変数の扱われ方 - PHP5のオブジェクトコピーでありがちな勘違い - PHPプロ!ニュース http://www.phppro.jp/news/304 コピーオンライト - Wikipedia http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%94%E3%83%BC%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%88 arrayはオブジェクトじゃないのでコピーオンライトは行われないかと思ったが、 実行時間を見ると、どうやらちゃんとコピーオンライトしているらしい。 ~ $ time php -r '$a=range(0, 100000);' 0.069 secs ~ $ time php -r '$a=range(0, 100000); $b=$a;' 0.068 secs ~ $ time php -r '$a=range(0, 100000); $b=$a; $b[100]=0;' 0.117 secs $bの値を書き換えた後、実行時間が2倍近くになってるだろ。 違う? じゃあどうして $b の一部を書き換えると、実行時間がこんなに延びんの? あ、環境書いてなかった。 ~ $ php --version PHP 5.2.6 (cli) (built: Sep 13 2008 11:13:29) Copyright (c) 1997-2008 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies つうかググればすぐ言及するページは見つかる。やっぱり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ちゃんねる