はじめに
先日、PHPのプログラムを実行中に、"Warning: number_format() expects parameter 1 to be double, string given in ..."というWarningが発生した。
原因は、DDSで数値型で定義されていたフィールドをPHPが参照し、その結果に対して組み込み関数"trim"を使用し、文字列となった値をテンプレート側で数値を期待しているフィールドに値をセットしていたことであった。
組み込み関数"trim"
説明するまでもないことかと思うが、PHPの組み込み関数"trim"は、指定した引数(文字列)の前後の空白を除去する機能を持っている。
以下は、"trim"を数値型の変数に対して使用した場合のコードである。
<?php
$test = 20231225;
$teststr = '20231225';
$trim = trim($test);
var_dump($test);
var_dump($trim);
var_dump($teststr);
上記の例を見ると、"trim"は文字列に対して行う関数であるが、数値に対して使用すると数値を文字列に変換しており、今回のWarningが発生したことがわかる。
最も"trim"は文字列に対して使用する組み込み関数であるため、数値型に対して使っていること自体が適切ではないことは明白だが、変数の型について再考するきっかけとなった。
RPGでの変数の扱い
RPGでは変数を宣言する際、必ず型桁の定義をする。これにより変数には、定義された型の値を転送することや定義された型によって使用する命令に制限がかかる。
例えば、数値型の変数同士の値転送では"Z-ADD"を用いるのに対し、数値型の変数を文字列型のフィールドや変数に転送するときは"MOVEL"命令を使う。
使用する命令が異なるため、意図的に変数の型変換を行っていると言える。
命令に制限がかかることなどは、一見窮屈に感じるかもしれないが、予期せぬ挙動を防ぐという点で見れば理にかなっているのではないだろうか。
変数型について
PHPの学習をしている中で、PHPは変数の型の定義をすることなく、変数に数値をセットしたらint型、文字列をセットしたらstring型として扱ってくれるなど柔軟性が高いと感じた。
筆者自身プログラマーとしての期間がまだ1年半ほどと経験が浅いこと、未経験の状態で最初に学んだ言語がRPGであることに起因する部分も大きいと思うが、今回のWarningを経て、変数の型は定義した方がよいと感じた。
変数を扱う上で、意図的に型を変更するのと意図せず型が変わっているのとでは、予期せぬ挙動が起こりかねないことも踏まえて大きく意味が異なるからだ。
最後に
今回は、変数の型から意図したコードを書くことの重要性を再確認したが、変数の型に限らずコードを書くときは、何のために、何の目的があってそのロジックを書くのかということが非常に重要であると思う。
実行結果に問題がないからOKではなく、目的を持ったコードを書くことを大切さを再認識した。