PHPでは変数のプリフィクスとして型によらず常に$を使い、配列はarray()で作成する。
また配列と連想配列(ハッシュ)の区別はなく、連想配列は配列としてもアクセスできる。
# Perl
$string = 'string';
@array = qw(this is an array);
%hash = ('key' => 'value');
$count = scalar(@array); # == ($#array + 1)
print "$string @array @{[%hash]} $count\n";
// PHP
$string = 'string';
$array = array('this', 'is', 'an', 'array');
$hash = array('key' => 'value');
$array = [0 => 'this', 'is', 'also', 'an' => 'array']; // PHP 5.4+
$count = count($array);
var_dump($string, $array, $hash, $count);
function bar(&$string, &$array, &$hash)
{
$string = 'foo';
$array = range(1, 5);
$hash = array(1=>1, 2=>4, 3=>9);
}
bar($string, $array, $hash);
PHPではリファレンスを使わずに多次元配列を作成できる。
# Perl
$multi = [['a1', 'a2'], 'b', ['c1', {'c2i' => 'value'}, 'c3']]; # cf. @multi = ([...
print length($multi->[2]->[1]->{'c2i'});
// PHP
$multi = array(array('a1', 'a2'), 'b', array('c1', array('c2i' => 'value'), 'c3'));
echo strlen($multi[2][1]['c2i']);
文字列内に変数を埋め込むには、Perlと同じように書く。
// PHP print "Welcome $user.\n"; print "Date: $date[0]/$date[1]/$date[2]";
配列・連想配列の添え字・キーが変数ではなく文字定数の場合、$array[key]のように'を書かない。また式が添え字・キーとなる時は必ず${array[...]}や{$array[...]}のように括る。
# Perl
print "I like $fruits{'like'}.\n";
print "I dislike ${fruits{'dislike'}}.\n";
print "There are many fruits like $fruits[int(rand($#fruits))] there.\n";
// PHP
print "I like $fruits[like].\n";
print "I dislike ${fruits['dislike']}.\n";
print "There are many fruits like ${fruits[array_rand($fruits)]} there.\n";
// [intval(rand(count($fruits) - 1))]
メンテナンスしにくいので実際には文字列結合演算子を使ったほうがよい。
# Perl print "This is " . $comparative . ".\n";
// PHP print "This is " . $comparative . ".\n";
PHPのヒアドキュメントはPerlと違い、行の終わりにしか使えない。そのためPerlに比べ見劣りする。
# Perl $text = <<END; ... END
// PHP $text = <<<END ... END;
# Perl call(<<"END",<<"END"); first END second END
// PHP call(<<<END first END ,<<<END second END );
PHP5.3以降ではPerlと同じように、終端文字列をシングルクオートで括ればよい。(PHPではnowdocと呼ばれる)
# Perl $text = <<'END'; ... END
// PHP $text = <<<'END' ... END;
PHP5.2までではヒアドキュメントで変数を展開しないようにはできない。
代用としてはPHP終了タグが使える。直前直後にブロックがある場合は{と}の代わりに:とendif等を使うと読みやすいかもしれない。
# Perl print <<'END' if (...); ... END
// PHP
if (...) : ?>
...
<?php
endif
リストの作成も配列と同様でlist()が必要になる。
# Perl ($x, $y,) = ($a, $b,); ($key, $value) = split(/\t/, $record, 2);
// PHP
list($x, $y,) = array($a, $b,);
list($key, $value) = explode("\t", $record, 2);
Perlでは配列の内容確認に"@array"という書き方ができたが、PHPでは同様の事をするにはimplode(' ', $array)とする必要がある。
そのかわり、多次元配列等の内容確認にはvar_dump()、print_r()関数が内蔵されている。
var_dump()は標準出力にダンプするが、print_r()は第2引数に真を指定することで変数に格納できる。
# Perl use Data::Dump qw(dump); print dump(\$string, \@array, \%hash); or use Data::Dumper qw(Dumper); print Dumper(\$string, \@array, \%hash);
// PHP
var_dump($string, $array, $hash);
or
$dump = print_r($variable, true);
print $dump;