奇特なブログ

「殊勝に値する行いや心掛け」を意味する、奇特な人になる為のブログです

リファクタリング手法その1

さて、たまには技術系の記事でも。

PHPは、関数の引数を可変にすることが出来るのを利用した手法です。
まず、以下の様なコードがありました。

-----------------------------------------------------------------------------------------


<?php

function test($val)
{
return mb_strlen($val);
}

-----------------------------------------------------------------------------------------

このコードに対して、「任意の文字コードを指定したい」という要望があった場合にどうするか。
そして、このコードが「100箇所」で呼ばれていたら?
また、100箇所全てではなく、一部の呼び出し箇所でだけ文字コードを指定したかったら?

他にも方法がありそうですけど、私が導き出したのは以下の手法でした。

-----------------------------------------------------------------------------------------


<?php

function test($val, $enc = NULL)
{
if (NULL === $enc)
{
return mb_strlen($val);
}
else
{
return mb_strlen($val, $enc);
}
}

-----------------------------------------------------------------------------------------

これで、呼び出し側が「$len = test($val);」とか「$len = test($val, 'UTF-8');」とかになっていても、
どちらでも問題なし。
あと、mysqliのfetch_arrayみたく引数に定数名を指定する場合は、
呼び出し側の引数を「定数名と同じ文字列」にして、

$mysqli_resultオブジェクト->fetch_array(constant($引数で渡されてきた定数名の文字列));

とかしたりもあります。

他の言語(例えばJava)なら、オーバーロードという言語仕様を用いれば良いんですけど、
PHPは出来ない(5.4.8で確認済み)ので、じゃあこういう方法になるかなぁと。