3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

perl ユーザの php メモ

Last updated at Posted at 2021-03-04

他人様の書いたコードのリライトが必要となったため、超絶久々に 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の三桁区切り
$ perl -le 'print scalar reverse join ",", unpack "(A3)*", reverse "1234567890"' 
1,234,567,890

phpでの3桁区切り

str_splitstrrevをつかう5

phpの三桁区切り
$ 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オプションを使う

hoge.php
<?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

こんなバギーなコードでも ;抜けしかチェックできないから、リライト対象のバグ探しには使えない。

  1. phpの大文字小文字の仕様については、別途確認

  2. substrについてはリライトすべきコードの中で多用されていたのでメモ

  3. eq==のエイリアスだなんて、、、

  4. 適切な表現がわからん。連想配列のキーもフォーマットコードの一部だと思うが、、、

  5. join は、implode のエイリアス。array専用だそうで。

  6. =>が、,のエイリアスじゃない!

3
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?