【新人研修だより】phpでコマンドラインツール作ってます

オフィス OJT

【新人研修だより】phpでコマンドラインツール作ってます
  • 【新人研修だより】phpでコマンドラインツール作ってます
こんにちは、どっこいもみじです。
最近、寒暖差が激しくて体調を崩してしまいそうな日々が続いてますね。関係ないですが僕はダイエットが続かなくて太る一方です。

ミッション


部署異動等でシステムを使用しなくなったユーザデータを複数のユーザデータベースから一括削除するコマンドラインツールを作るというミッションが発生したので1からコードを書いています。

本来はComposerでライブラリをインストールするべきですが、今回はPHPの勉強も兼ねてスクラッチしました。

コマンドラインツールって何


正直コマンドラインツールの意味を知らなかったのでまずはそこから調べました。

コマンドラインツールとは!!
マウスなどで操作するアプリケショーンとは違い、キーボードでコマンドを入力して操作するアプリケーションのこと。
なるほど。

早速作業開始


コマンドラインツールが何かは理解したのですが実際にコードを書くと様々な学びがあったので挙げておきます。

 ・コマンドの引数ってどうやって受け取るの... → argv、getopt()があった
 ・strlen()だとマルチバイト文字に対応してない... → mb_strlen()というものがあった
 ・コードを頑張って綺麗にしたい...

コマンドの引数ってどうやって受け取るの


vagrantやGitなどなど色々な場面でコマンドを実行してきたのですが中身で何が起きているのかイマイチ把握できてないことがほとんどでした...反省
今回のミッションを達成するには必要不可欠だったので「コマンド 引数 受け取る」などのワードで検索して必死に調べました。
・argv
まず初めに使用したのがargvです。例えば....
php ○○.php argument1 argument2
みたいなコマンドを実行した時には、「○○.php」はargv[0]、「argument1」はargv[1]と指定することで引数の値を取得してくれるようです。
とっても便利!!

・getopt()
argvでもよかったのですが勉強という意味も兼ねてgetopt()も使用してみました。
php ○○.php -a=argument1 -b=argument2
こんな風に引数の値を取得したい時にはgetopt()を使って実現することができました。
getopt()で引数の値を問題なく受け取れた時は連想配列となって返ってきます。あとは$変数名["a"]のようにすれば値が取得できますね。

・mb_strlen()を使う
今までは文字列の長さを取得するならstrlen()みたいな固定概念があったのですが、これじゃあマルチバイト文字に対応していない!と指摘を受けました。
strlen()が返す値は文字数ではなくバイト数のため、文字コードがUTF-8かShift-JISかで違う値が返ってきてしまいます。
(超基本的なことだと思うのに全く意識していなかった自分が恥ずかしい....)
そこでmb_strlen()はマルチバイト文字の1文字を1個としてカウントしてくれるため、文字数を受け取るには最適の関数というわけです。

コードを頑張って綺麗にしたい...


今までの業務でもあったのですが、自分が書いたコードは100行ぐらいだったのに、レビューしてもらって修正したコードは50行以下になっていることが多々ありました。
何でも短ければ良い訳ではないと思いますが今回も3回ほどレビューしていただいて50行ぐらい短くなりました。
短くできたポイントとしてはこの2つです。
 ・似たようなコード多すぎ
 ・if文多様しすぎ

同じコードでも、渡すパラメータが違うためそれらをほとんどif文で判定するようにしていたのですが、パラメータが違うだけなら引数で渡してしまえば良いのではというアドバイスを受け、コード修正するとかなりスッキリしたコードになりました。
言われてみれば確かに!!と思うのですが全く実践できてない辺り自分の中で意識できていないんだなと反省すると共に頑張ろうという気持ちにもなりました。

まとめ


修正点はまだまだありますがまっさらな状態からコードを書くのは意外と楽しかったです。でも楽しいだけじゃなくて人に見られても恥ずかしくないようなコードを書けるようになりたいですね。
《どっこいもみじ(澤田)》

こちらもどうぞ

まとめ

page top