他人様の書いたコードのリライトが必要となったため、超絶久々に php を触った。
その際の初心者的メモ
php のみのスクリプト
は1行目に <?php
で始める。
最終行に?>
を記載するのは推奨されていない。
phpタグ
リライト対象に<?PHP
と書いてたのあったが、普通は<?php
だよね?つか、<?pHP
でも<?PHp
でも良いって、、、
一応、マニュアルサイトとか大多数の記載通りに<?php
にしとくべ1
ワンライナー
-r
を使う
$ php -r "echo 1;"
1
型
当たり前だけど、変数とかには型があるよねぇ2。
$ php -r 'echo gettype("0123");'
string
$ php -r '$a = "0123" ; echo gettype($a);'
string
$ php -r '$a = "0123" ; echo gettype(substr($a, 0, 3));'
string
$ php -r 'echo gettype(0123);'
integer
$ php -r 'echo 0123;'
83
で、文字列の比較
===
を使う3
$ php -r '$a = "0123"; echo strcmp($a,"0123") == 0;'
1
$ php -r '$a = "0123"; echo $a === "0123";'
1
strcmp
は、関数を呼び出す分遅くなる(と色々なところで指摘されている)ため使わない。
===
は、型の比較が入るので、gettype
で想定する状況を確認しながら利用する。
elseif
else if
でも通るが、ブロックを使った記法でのみ使用できる。
まelseif
にリライトしとくべきか。
unpack
リライト対象で、文字列切り出しにsubstr
連発するのに切れて、(自分的にperlでは定番である)unpack
について調べる。が、、、
戻り値が連想配列 orz...
マニュアルが分かりにくい。
unpack
の場合、連想配列のキーを各フォーマットコードの後4に指定する、とか、/
で複数のフォーマットコードを連結するとか、どこで調べるのよ。
皆様、バイナリ相手にしてて、ascii相手のサンプルなんてググっても出てこないし、、、
YYYYmmddのunpack
ということで、↓サンプル。この例だと明らかにperlより使い勝手はよい、か?
$ php -r '$c = unpack("A4y/A2m/A2d", "20210303") ; print_r($c);'
Array
(
[y] => 2021
[m] => 03
[d] => 03
)
- y, m, d をキーに ascii 4文字、2文字、2文字に分割
これが、キーを指定しないと最後のフォーマットコードで取得された文字のみが連想配列になる。
しかもインデクスが1!
$ php -r '$c = unpack("A4/A2/A2", "20210303" ) ; print_r($c);'
Array
(
[1] => 03
)
perlでの3桁区切り
perlでの常套手段だった、(A3)*
なんぞ、できない。
$ perl -le 'print scalar reverse join ",", unpack "(A3)*", reverse "1234567890"'
1,234,567,890
phpでの3桁区切り
str_split
とstrrev
をつかう5
$ php -r 'echo strrev( join(",", str_split(strrev("1234567890"),3)));'
1,234,567,890
array出力の変数への代入
perl での↓コレ
my ( $c, $d ) = @d ;
phpでは、list()
を使う
$ php -r '$a = array( 1,2,3) ; list( $b, $c, $d ) = $a ; echo $d ;'
3
二次元配列とかでも即座に対応できるのはうれしいかな。
$ php -r '$a = array( 1, array(2,3) ) ; list( $b, list( $c, $d ) ) = $a ; echo $d ;'
3
いらない要素は無視することも出来る
$ php -r 'list( , ,$a ) = preg_split("/\s+/", "2021 03 03") ; print $a ;'
03
連想配列にも対応できる6。
$ php -r 'list( "y" => $y, "d" => $d ) = unpack("A4y/A2m/A2d", "20210303" ) ; echo $d ;'
03
$ php -r 'list( "1" => $d ) = unpack("x6/A2", "20210303" ) ; echo $d ;'
03
三項演算子
噂で知ってたけど、シンプルな A ? B : C
のみの使用にとどめるべき。
シンタックス確認
-l
オプションを使う
<?php
$a = "20210303" ;
list( $b ) = unpack( "A4/A2/A2y" )
echo $b ;
$ php -l hoge.php
Parse error: syntax error, unexpected 'echo' (T_ECHO) in hoge.php on line 4
Errors parsing hoge.php
こんなバギーなコードでも ;
抜けしかチェックできないから、リライト対象のバグ探しには使えない。