PerlerのためのPHP2
続き。
- 作者: David Sklar,桑村潤,廣川類
- 出版社/メーカー: オライリージャパン
- 発売日: 2005/10/27
- メディア: 単行本
- 購入: 6人 クリック: 54回
- この商品を含むブログ (41件) を見る
そういえばtrueとfalseが抜けていた。
つーか「===」って何よ。
調べた。
PHP: PHP 型の比較表 - Manual
ここの表が全てかな。
<?php if (1 == true) { print "ok[1==true]\n"; } if (1 === true) { print "ok[1===true]\n"; } if (1 === 1) { print "ok[1===1]\n"; } ?>
ok[1==true] ok[1===1]
では続き。
多次元配列
Perl
@array = ( [ 'a', 'i', 'u', 'e', 'o'], ['ka', 'ki', 'ku', 'ke', 'ko'], ['sa', 'si', 'su', 'se', 'so'], );
Perlでは厳密には多次元配列ができなくて、代わりに配列のリファレンスを要素として擬似的に多次元配列を実現している。
PHP
<?php $array = array( array( 'a', 'i', 'u', 'e', 'o'), array('ka', 'ki', 'ku', 'ke', 'ko'), array('sa', 'si', 'su', 'se', 'so'), ); ?>
PHPではそもそもがPerlでいうところのスカラで配列を表現しているから、Perlより多次元であることが分かりやすいと思った。
多次元配列の要素にアクセス。
Perl
print $array[1]->[1]; #=> ki # or print $array[1][1]; #=> ki
PHP
<?php print $array[1][1]; #=> ki $array[1][] = 'ga'; # push print $array[1][5]; #=> ga ?>
関数呼び出し
引数
Perl
sub ppp { my ($m, $n) = @_; print "\$m => $m, \$n => $n \n"; } ppp('1st', '2nd'); #=> $m => 1st, $n => 2nd
引数値がなかったらのためにデフォルトを用意
Perl
sub ppp { my $m = shift @_ || 'First'; my $n = shift @_ || 'Second'; print "\$m => $m, \$n => $n \n"; } ppp('1st'); #=> $m => 1st, $n => Second
PHP
<?php function ppp($m = 'First', $n = 'Second') { print "\$m => $m, \$n => $n \n"; } ppp('1st'); #=> $m => 1st, $n => Second ?>
デフォルト引数に関しては、PHPは最初に用意しておく変数に代入する形をとる。
うーん、なんかここだけ見ると、最初にこれを代入して始めます、みたいに見えて少し迷いそう。
また、Perlでもそうだけど、引数の順番は絶対なので、PHPのデフォルト引数設定は「3個の内の2個目だけ」はできない。
<?php function ppp($m, $n = 'Second', $o) { // これはできない } ?>
引数はなに渡し?
Perl
Perlは変数渡し。
$word = 'aiueo'; sub ppp { $_[0] = 'kakikukeko'; } print $word; #=> aiueo ppp($word); print $word; #=> kakikukeko
PHP
PHPは値渡し。
<?php $word = 'aiueo'; function ppp($w) { $w = 'kakikukeko'; } print $word; #=> aiueo ppp($word); print $word; #=> aiueo ?>
参照渡しには「&」を使うらしいけれど、まだそこまでいってない(僕が)。
参考:「引数 - Wikipedia」
返却値
return。
関数内でグローバル変数にアクセス
Perl
our $aaa = 'our_aaa'; sub ppp { my $aaa = 'my_aaa'; print $aaa,"\n"; print $main::aaa,"\n"; } ppp; #=> my_aaa #=> our_aaa
our でパッケージ変数にして、それをフル変数名で呼び出すみたいな。
PHP
<?php $aaa = 'global_aaa'; function ppp() { $aaa = 'infunc_aaa'; print $aaa; print $GLOBALS['aaa']; } ppp(); #=> infunc_aaa #=> global_aaa ?>
すごく、no strict "refs"; したくなります。
もうひとつPHPには、グローバルであることを示す「globalキーワード」なるものがあるけれど、
一般的に筆者がお勧めするのは、globalキーワードのかわりに関数内のグローバル変数にアクセスする$GLOBALS配列を使うことです。$GLOBALSを使うとグローバル変数を処理していることをどの変数のアクセスにも合図してくれます。
P.81
ということらしいので、こちらで覚えよう。
ついでに引用。
$GLOBALS配列は、関数内で使われても関数外で使われても、常にスコープの中にあります。これは$GLOBALSがオートグローバルと呼ぶ前もって定義された特別な種類の変数だからです。
P.81
なるほどなー。固定かな。