Ranvis Script

Ranvis Script > Perl/PHP > 基本的な構文

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;