53件中 36-40件目     [ ... 2 3 4 5 6 7 8 9 10 11 ]

PHPでは2つの配列を合わせるのに、「+」演算子で行う方法とarray_merge関数で行う方法がある。 2つの方法は全く同じ動作をするわけではなく、いくつかの違いがある。


2007/10/09 23:36:33 投稿 (2008/01/27 18:43:29 更新) http://www.programming-magic.com/20071009233633/
タグ [ PHP , Tips ]
修正:
  • 「+」による配列の加算時の値の優先を逆に書いていたり、コードがおかしかったりしたので、書き直し。修正前に見ていた方々、すいませんでした。 (2008/01/27 18:43:29)

PHPでも当然、整数値(int型)の限界値(最大値)というものが存在する。 PHPの場合、定義済み定数にPHP_INT_MAXというものがあり、それで限界値を知ることができる。 int型のバイト数を知りたければPHP_INT_SIZEで知ることができる。

C言語などの多くの言語では、その値を超えるような計算をするとオーバーフローして値がおかしくなるが、PHPではint型最大値を超えると、データの型がfloat型になる。 例えば、32bit環境の場合「PHP_INT_MAX」はint(2147483647)だが、「PHP_INT_MAX + 1」はfloat(2147483648)となる。

ここで注意したいのは、一度float型になると値がint型の範囲になっても自動でint型に戻ることはないということだ。 つまり、「(PHP_INT_MAX + 1) - 1」はfloat(2147483647)となる。

これがどんなときに問題になるかというと、データの比較をするときに問題になることがある。 例えば、「(PHP_INT_MAX == (PHP_INT_MAX + 1) - 1)」という比較は値が同じなのでtrueであるが、「PHP_INT_MAX = = = (PHP_INT_MAX + 1) - 1」という比較は型がintとfloatなのでfalseである。
また、floatやdoubleのような浮動少数点のデータは誤差が発生することがあるために、「((PHP_INT_MAX * 11300002) / 11300002) = = PHP_INT_MAX」という比較の結果はfalseである。

$test = PHP_INT_MAX;           // int(2147483647)
$test = PHP_INT_MAX + 1;       // float(2147483648)
$test = (PHP_INT_MAX + 1) - 1; // (2147483647)
$test = (PHP_INT_MAX = = (PHP_INT_MAX + 1) - 1);    // bool(true)
$test = (PHP_INT_MAX = = = (PHP_INT_MAX + 1) - 1);  // bool(false)
$test = (((PHP_INT_MAX * 11300002) / 11300002) = = PHP_INT_MAX); //bool(false)

PHPではそんなにも大きな値を扱うことは滅多にないし、64bit環境になれば扱える値も大きくなるので、これでなんらかのバグにはまることはほぼないだろうが、一応頭には入れておきたい。


PHPでエラーが発生したとき、どのファイルの何行目でエラーが発生したかなどは表示されるためにすぐにわかることだが、そのエラーが自作関数の中で発生した場合、その関数がどこから呼ばれたのかを知りたいことは多い。 開発環境によっては、なんらかのソフトウェア(Zend Studioなど)の機能でそれを調べることができることもあるが、できないこともある。

実は、バックトレース(呼び出し履歴)はPHP標準の関数で表示させることができる。


PHPでは十進数以外を使うことは稀だと思うが、多くのプログラミング言語で、十進数以外を使う機会はある。 PHPには標準関数の中に2進数や10進数、16進数などの相互変換だけでなく、n進数からm進数に変換する関数もある。

$result = decbin($number);        // 10進数 → 2進数
$result = bindec($binary_string); // 2進数 → 10進数
$result = decoct($number);        // 10進数 → 8進数
$result = octdec($octal_string);  // 8進数 → 10進数
$result = dechex($number);        // 10進数 → 16進数
$result = hexdec($hex_string);    // 16進数 → 10進数
$result = base_convert ($number, $frombase, $tobase); // n進数 → m進数

これらで大きな値を数値に変換する際には、値の範囲に制限があることに注意。


formからデータを送る方法にはGETとPOSTの2種類がある。 基本的にはその2種類のどちらかしか使わないが、formのaction属性に指定するURLを書き換えることで、GETとPOSTの両方を同時に送ることもできる。

<form action = "?test=1234&name=Fermat" method = "POST">
	<table>
		<caption>GETとPOSTを同時送信</caption>
		<tbody>
			<tr><th>年齢[age]</th><td><input type = "text" name = "age" value = "45"></td></tr>
			<tr><th>名前[name]</th><td><input type = "text" name = "name" value = "Gauss"></td></tr>
		</tbody>
	</table>
	<input type = "submit" value = "送信">
</form>

このように書くと、action属性に書いたtestとnameの値をGETで、inputタグに書いたageとnameの値をPOSTで送る。


53件中 36-40件目     [ ... 2 3 4 5 6 7 8 9 10 11 ]