【待望】PerlユーザのためのPHP入門
見事Perl→PHPへの脱皮に成功した俺様が 両者の違いを中心に講義してやる。 今までPerlマンセーだったやつはこれを機にPHPに変更しよう也。 質問もガンガン書いてくれ。 このPerlの文はPHPだとどう書くの?とか。 まず、両者には似てる部分も非常に多いというのは特徴だ。 例えば変数の宣言、初期化をしてみよう。 $foo = 0; 頭に$をつけるところも、型を特に指定する必要がないことも、 文末は;になることもみんな一緒だ。 ほら、簡単に移行できそうに思えてきただろ? とりあえずHello, world!を出力してみるぞ。 <? print "Hello, world!\n"; ?> printの意味はperlと一緒だ。 まあ、printよりecho使う人が多いがそんなに違いはない。 perlユーザならわかりやすい方が(・∀・)イイ!だろう。 プログラムの開始と終了は<?と?>で囲むんだ。 これはPHP特有だから早く覚えよう。 <?じゃなくて<?phpで囲んでもOK。将来XMLとの連携を考えるなら 後者で書く癖をつけたほうが良いとは言われている。 PHPでrequireするファイルは必ず<?php ?>で囲まなきゃダメ? とりあえずCGIじゃなくてmod_phpを使っていこう。 例えばCGI/Perlの場合、 #!/perl/bin/perl print "Content-type: text/html\n\n"; print "Hello, world!\n"; 簡単なテストスクリプトを書くときも2行目あたりのウザイのを 書く必要があったがmod_phpならそんな必要はない。 とにかく<?と?>で囲めばOKだ。 というわけで課題として、各自ローカルサーバにPHPをインストールしておこう。 PerlユーザならApacheはインストールしてあると思うのでそれを前提とすると、 http://www.php.net/downloads.php 上記サイトにある Windows Binaries PHP 4.3.1 zip package [5,853Kb] を落とすのじゃ。下のPHP 4.3.1 installerの方が楽そうに見えるが こっちはCGI/PHPとしてしか使えないから駄目。間違えるなよ。 >>6 どういう用途で用いるのか知らんが PHPスクリプトをrequire()するなら当然 そっちも<? ?>は必要だぞ。 まあ、聞くより自分で確かめたほうが早いだろう。 PHPのインストールについては 詳しく解説しているところを見たほうが早いか。 始めたばかりの頃俺が参考にした所だ。 http://www.php-j.com/tutorial/install/win.php では各自ローカルでPHPを動かせるようにしておきましょう。 その瞬間からPerlとはおさらばだ! win用をインスコしたいのですが ここ以外にバイナリって無いんですか? http://www.php.net/downloads.php >>11 そこのじゃ嫌なのか? そこからで全然問題ないと思うが。 CGI/Perlの場合は 能や予、表などの漢字を使うときに文字化けしないように \能、\予、\表みたいな面倒な書き方をする必要があっただろう。 PHPでは大半の人がEUCの日本語コードで記述していて そのような必要はない。 と、言うわけでEUCを読み書き・保存できるエディタを用意しておきましょう。 例えば、Windows標準のメモ帳では無理です。 まあ、ベクターとかでEUCって検索すればすぐに見つかる。 http://channel.goo.ne.jp/download/search/search.php3?MT=euc&CD=1&SW=1&OS=3&category=1&search_num=10 シェアウェアのものでよいならば秀丸やEmEditorがお奨め。 質問なんですけど、 関数の引数にハッシュを使う方法ってありますか? function func($key,$value){ return "$key => $value"; } $result = func("key"=>"value"); みたいにやりたいのですが Parse error: parse error, unexpected T_DOUBLE_ARROW というエラーがでました。 function func($key=>$value){ return "$key => $value"; } でも無理でした。 (PerlCode) $name="john"; $say=sub{return "My name is $_[0].";}; print &{$say}($name); はPHPで書くとどうなりますか? >>18 <?php $name = "jhon"; function say($name) {return("My name is $name");} echo say($name); ?> そんなもんをXHTMLに埋め込んだら、見苦しくて死ぬぞ。 ブラウザでパースもできんようになるし。 MVCにしろや。 >>20 お答えサンクス。 と、いうわけでもうインストールはばっちしだと思うので 今日はユーザー定義関数についてから話そう。 超独自仕様のPerとの大きな違いの1つだ。 まあ、はっきり言っちゃえば >>18 みたいな書き方はPerlではごく普通だが Perl知らない人から見れば何なのかさっぱりってほど特殊だ。 それに比べてPHPの>>20 は他の言語 (例えばJavaとか)しか知らない人が見ても何となく理解できるだろう。 >>20 レスどうもです。 無名サブルーチンみたいなのが使いたいなと思っていたのですが、 create_function関数というのがあるみたいですね。 http://www.php.net/manual/ja/function.create-function.php <?php $name="john"; $say=create_function('$name','return "My name is $name.";'); print $say($name); ?> Perlでは関数でなくサブルーチンと呼ばれていたな。 sub foo { print "$_[0] "; return $_[0]+100; } $b= &foo(100) print $b;; #100 200 ------------------- function foo($a) { print "$a "; return $a+100; } $b= foo(100); print $b; #100 200 PHPの場合は明示的に引数を記述しておく必要がある。 可変引数は配列を渡せば良いだろう。Perlも実際は@_という配列を渡しているわけだし。 まあ、こうやって見ると両方大した違いは無く見えるが 変数のスコープについて根本的な違いがあるので注意しよう。 それについては後述。 いちいち引数を書くとは面倒になったと言う人もいるだろうが、 おかげでデフォルト引数を簡単に実現できる。 <?php function foo2($a ="俺様") { print "$a は凄い<br>"; } foo2("お前"); foo2(); ?> /* お前 は凄い 俺様 は凄い */ 引数を指定しなかったら勝手に俺様が凄くなってくれるのだ。 講座スレ作ろうとする奴って大体理論が崩壊してるよな・・・。 Perlでは関数でなくサブルーチンと呼ばれていたな。 sub foo { print "$_[0] "; return $_[0]+100; } $b= &foo(100) print $b;; #100 200 ------------------- function foo($a) { print "$a "; return $a+100; } $b= foo(100); print $b; #100 200 PHPの場合は明示的に引数を記述しておく必要がある。 可変引数は配列を渡せば良いだろう。Perlも実際は@_という配列を渡しているわけだし。 まあ、こうやって見ると両方大した違いは無く見えるが 変数のスコープについて根本的な違いがあるので注意しよう。 それについては後述。 これかいてる間に重要なこと思い出した。 #Perl code $a=26; print "$aゲット"; #26ゲット ------------- #PHP code $a=26; print "$aゲット"; #(何も表示されない) ---------------------- 両者にはこのような違いが起きてしまう。 下はどうすればよいのか各自考えてみましょう。 出かけるので解答は夜で。 >>26 俺様はPHP歴浅いので 崩壊どころか理論自体形成されていない。 だからこのスレタイは入門だ。 間違いはがんがん指摘してクレイ! >>30 俺はPHPすら分からない。 だから、がんがん解説してクレイ! 結構見やすいPerl/PHPの構文比較のページ見つけました。 Perl/Php Translation http://www.cs.wcupa.edu/ ~rkline/perl2php/ 既出だったらゴメン。 >>32 それは便利だな。 では今後はそこに載ってないやつを指摘していくことにしよう。 >>18 <?php $name = "jhon"; function say($name) {return("My name is $name");} echo say($name); ?> Perlでは関数でなくサブルーチンと呼ばれていたな。 sub foo { print "$_[0] "; return $_[0]+100; } $b= &foo(100) print $b;; #100 200 ------------------- function foo($a) { print "$a "; return $a+100; } $b= foo(100); print $b; #100 200 PHPの場合は明示的に引数を記述しておく必要がある。 可変引数は配列を渡せば良いだろう。Perlも実際は@_という配列を渡しているわけだし。 まあ、こうやって見ると両方大した違いは無く見えるが 変数のスコープについて根本的な違いがあるので注意しよう。 それについては後述。 Perlでは関数でなくサブルーチンと呼ばれていたな。 sub foo { print "$_[0] "; >>28 変数名の後ろは全角文字でもダメみたいですね。 (半角の「.」はOKだった) #PHP code $a=26; print $a."ゲット"; #26ゲット #PHP code $a=26; print "$a.ゲット"; #26.ゲット >>28 print "${a}ゲット"; print $a."ゲット"; echo $a,"ゲット"; Perlでは関数でなくサブルーチンと呼ばれていたな。 sub foo { print "$_[0] "; return $_[0]+100; } $b= &foo(100) print $b;; #100 200 ------------------- function foo($a) { print "$a "; return $a+100; } $b= foo(100); print $b; #100 200 PHPの場合は明示的に引数を記述しておく必要がある。 可変引数は配列を渡せば良いだろう。Perlも実際は@_という配列を渡しているわけだし。 まあ、こうやって見ると両方大した違いは無く見えるが 変数のスコープについて根本的な違いがあるので注意しよう。 それについては後述。 Perlでは関数でなくサブルーチンと呼ばれていたな。 sub foo { print "$_[0] "; >>36 _n ( l _、_ \ \ ( <_,` ) ヽ___ ̄ ̄ ) グッジョブ!! / / >>37 _、_ ( ,_ノ` ) n  ̄ \ ( E) グッジョブ!! フ /ヽ ヽ_// 些細なことに見えるが、 自分はこのせいで某スクリプトを PerlからPHPに移植する際に、 30分ぐらい睨めっこした記憶があるので。 頭の中に入れて起きましょう。 $a=26; print "{$a}ゲット"; print $a."ゲット"; 先生質問です。 >>9 の通りしましたがapacheが起動できません。 どうやらhttpd.confのLoadModule php4_module C:/php/sapi/php4apache.dllが原因のようです php4apache.dllをphp4apache2.dllとしても同じでした。 WinME Apache2.0.39です >>42 Apacheは2よりも1.3.27の方がいいと思う。 後はなんだろな〜 Meなんて怪しいOS使ったことないからな。 とりあえずApacheのバージョンを変えて試してみてクレイ。 >>44 ありがとうございます。1.3.27を使ったら起動できました。 | | ∧ |_|Д`) < それだー!! |文|⊂) | ̄|∧|  ̄ ̄ ̄ ̄ ̄ | | ∧ |_|Д`) < それだー!! |文|⊂) | ̄|∧|  ̄ ̄ ̄ ̄ ̄ | | ∧ |_|Д`) < それだー!! |文|⊂) | ̄|∧|  ̄ ̄ ̄ ̄ ̄ | | ∧ |_|Д`) < それだー!! |文|⊂) | ̄|∧|  ̄ ̄ ̄ ̄ ̄ | | ∧ |_|Д`) < それだー!! |文|⊂) | ̄|∧|  ̄ ̄ ̄ ̄ ̄ >>44 OS = Windowsとか思っている痛い講師がいるクソスレはココですか。 >>47 世の中は理詰めだけでは解決しない。 理論ヲタになるより、わかりやすさを求める方が現実的だ。 わかるかい? しかも、PHPと直接は関係ない。 君は文学者がテイラー展開を出来なかったら馬鹿にするだろうか? では、今日はいよいよ変数のスコープについての説明だ。 あくまでも対象者は基本的に『Perlしか』やったことがない人のみ。 C言語など他の言語をやっている人には馬鹿見たく思われる説明になるからだ。 >>48 >君は文学者がテイラー展開を出来なかったら馬鹿にするだろうか? 少なくとも数学者を目指す文学者がマクローリン展開を知らなければバカにするが。 >>49 俺様はべつにオペレーティングシステムのエキスパートを目指してはいないッポ。 #Perlscript sub foo{ $a = 100; print "$a,"; $a++; } &foo(); print $a; #100,101 まあ、当たり前の結果が表示されます。 これをPHPに書き換えてみましょう。 #PHPscript <?php function foo(){ $a = 100; print "$a,"; $a++; } foo(); print $a; ?> # 100, 何故か100しか表示されません!?( ̄□ ̄;)ナント!! どうして後ろの$aは表示されなかったのでしょうかという問題です。 同様の例です。 #Perl sub hoge{ print $a; } $a="俺様"; &hoge; ---------- #PHP function hoge(){ print $a; } $a="俺様"; hoge(); Perlの方だと見事、俺様と表示されるのですが、 後者の方は何も表示されないので吃驚仰天です。 >>50 >俺様はべつにオペレーティングシステムのエキスパートを目指してはいないッポ。 いや、エンジニアでなくても車=ベンツとか思ってる奴はアホなわけで。 教養ではなく常識なのよ。常識。 >>54 どうしていつものコテハンを使わないんですか? >>55 ごめんごめん。かんじよめないんだ? ジャマ。キエロ >>54 ,>>56 (・∀・)カエレ!! せっかくこのスレを良い感じにしたいのだから 煽りはよそでやってクレイ。 >>53 まあ、教養が無かった俺様が厨ってことで その話題は終わりにしよう。スレ違いだし。 >>50-51 Perlがデフォルトでグローバル変数なのに対して、 PHPでは、デフォルトでローカル変数だから。 #PHPscript <?php function foo(){ $a = 100; print "$a,"; $a++; } foo(); print $a; ?> は #Perlscript sub foo{ my $a = 100; print "$a,"; $a++; } &foo; print $a; と同じ #始めたばかりなので全く同じかどうかとか用語の使い方は正しくないかもしれません #PHPscript <?php $a = 999; function foo(){ $a = 100; print "$a,"; $a++; } foo(); print $a; ?> #100,999 なーる。 >>60 (*゚▽゚ノノ゙☆パチパチ Perlにおいていわゆるmyを付けた場合が PHPでは標準になっています。 C言語などの場合はコンパイル時に 未定義(未宣言)の変数だ!ってエラーを出してくれるのですが、 PHPではそのまま初期値(文字なら空白、数字なら0)として 認識してしまうので注意しましょう。 結構すんなり受け入れられるのかなー? 普段からmyを使ったりしている人なら問題ないだろうけど プログラミング言語をPerlしかやってないでグローバルなのが当たり前だって 思ってた人には受け入れるのに時間が掛かるかもしれない。 そんなことないか?どうだろう。 逆にPerlの標準のようにグローバル(大域)変数として 扱いたい場合も書いておきましょう。 これはCやJavaとも違う仕様ですね。 関数内の最初でglobalと宣言します。 なお、PHPの設定でregister_globalsをonにすると また違うようなのですが、デフォルトはoffで推奨となっているのでそれに従います。 <?php $a = 999; function foo(){ global $a; //これでグローバルスコープの$aを参照しますよと宣言している。 print "$a,"; $a++; } foo(); print $a; ?> #999,1000 因みに、function foo()はどこに書いてもOKです。 (PHP3だったころは駄目だったとか・・・) >>63 [p:(r)l] Perlには静的(スタティック)変数が無かったと思うので それについても書いておきましょう。 function foo(){ static $a=0; print $a; $a++; } for($i=0;$i<5;$i++){ foo(); } #01234 このようにすると 最初にfoo()が呼ばれたときのみstatic $a=0が呼ばれてくれるのです。 以降、foo()が呼ばれるたびに$aは1ずつ増加してくれます。 staticをつけないと毎回0が出力されてしまいますね。 変数のスコープは関数内のみなのに値を保持していてくれるわけです。 globalでは無いので関数外部から直接$aの値をいじることは出来ません。 perlの use strict; のような未定義変数をチェックする方法はPHPに無いのでしょうか。 { my $static = 0; sub foo () { return ++$static; } } >>66 すまんが俺様は知らんな。 全ての定義済の変数を配列で返すような 関数ならあるが。 <?php $def_arr= get_defined_vars(); //初期設定(_SERVER["SERVER_ADDR"]のようなもの) //を含む全ての定義済みの変数の配列を得る) $a=3; $abc=10; $arr = get_defined_vars(); //初期設定のものに上の2つが追加された。 $new_arr = array_diff($arr,$def_arr); //2つの配列の差を得る。 print_r($new_arr);//配列の内容を出力 ?> #Array ( [a] => 3 [abc] => 10 ) >>67 なるほど。Perlでstaticを実現した例ですね。 まあ、PHPの場合はわざわざ自前で作らなくても 最初からstaticという命令が用意されているということです。 >>68 Perlをある程度理解していれば わかるようにしたいのだが、 (Perlも未経験という場合はちょっと厳しいです。) どこら辺がわからんだろうか? とりあえずPerlのsubをfunctionに置き換えちゃえばOKだ。 >>66 error_reporting(E_ALL); でどうかな。 <?php error_reporting(E_ALL); print $a; ?> #<b>Notice</b>: Undefined variable: a in <b> (filename) # </b> on line <b>3</b><br /> >>76 ありがとう。うまくいきました。 >>76 (・∀・)イイ! φ(.. )メモシテオコウ error_reporting(E_ALL); よっしゃ!早くも寂れてきたぞ。今日は配列について書いておこう。 まず、Perlの場合配列値を表す変数は先頭が$でなく@になっていた。 しかしPHPではそんな面倒なことはない。どんな場合でも先頭は$でOKだ! 凄い楽そうだろ?(祝 初期化の差はこんな感じだ。 #Perl @a = (20,10,30,3); #PHP $a = array(20,10,30,3); arrayって余計な文字が付いたが細かいことは気にするな。 驚くことにPHPでは $a[] = "a"; $a[] = "b"; $a[] = "c"; $a[0] = "a"; $a[1] = "b"; $a[2] = "c"; この2つが同じ意味となるのだ。 角括弧内の数字を省略した場合、 値は配列に最後の要素として勝手に追加してくれる。 まあ、こういう独自仕様は混乱の元だから俺は上の形式で書いたことは無いがな。 わかった上で使うなら利用場面は結構多いかもしれない。 配列の関数一つ一つ説明するのは面倒だから あとは>>32 のサイトや公式のマニュアルでも読んでくれ。 Perlで実現できてたことの代替手段は大体存在してる。 多次元配列は一つ注意を。 これは前も似たようなこと言ったが $a[0][1] = 41; print "$a[0][1]"; Perlだと期待する結果41が出力されるが、 PHPだとArray[1]という怪しげな結果が出力されてしまう。 後ろの[1]はただの文字列として認識されてしまっているようなのだ。 以下のどちらかにしないといけない。 $a[0][1] = 41; print "{$a[0][1]}"; print "".$a[0][1]; まあ、おかしくなったらまずは変数を{}で括ってみろってことだ。 @a{qw(a b c)} = @b[1..3]; こういうのはどう書く? >>89 うーん、よくわからんな(汗 誰かわかる人募集中だ! まあ、とりあえず根性で全部書いておけ。 $a = array( "a" => $b[1], "b" => $b[2], "c" => $b[3], ) 日本語すら満足に書けない俺様が講師のクソスレはここですか? 見ずらいんだよ。 見ずらいんだよ。 見ずらいんだよ。 見ずらいんだよ。 見ずらいんだよ。 見ずらいんだよ。 見ずらいんだよ。 見ずらいんだよ。 見ずらいんだよ。 見ずらいんだよ。 見ずらいんだよ。 見ずらいんだよ。 見ずらいんだよ。 見ずらいんだよ。 見ずらいんだよ。 見ずらいんだよ。 見ずらいんだよ。 見ずらいんだよ。 見ずらいんだよ。 見ずらいんだよ。 見ずらいんだよ。 見ずらいんだよ。 ∧_∧ ( ´∀`)<きもい。きもい。 ( つ (_○___) 見づらいんだよ。でした。すまん。 俺は「俺様」じゃないです。 普通に見てる人もいるんで、煽ってるやつらマジでどっかいって。 >>97 普通にウザがってる人もいるんで自分のサイトでやるように説得してください。 煽りでもレスが付かないよりは大歓迎だ! >>98 需要も少しはあるようだからまあ、多めに見てもいいじゃないか。 WebProg板ってスレ保持数に比べて活性化しているスレ数が非常に少ないから 他のスレがdat落ちして困るとかも無いしな。ウザかったら見なければ(・∀・)イイ! 2chブラウザ使ってこのスレごとあぼーんだ。 今日はオブジェクト指向について書いておこう。 PHPもPerlもJavaやC++に代表されるオブジェクト指向言語である。 Perlのオブジェクト指向についてあまり知らないんですが、 Javaに比べるとPHPのオブジェクト指向に関する仕様は ショボイ!!!! 今年中に出る予定のPHP5で大幅に機能がアップするらしいので それに期待しましょう。 read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる