132件中 96-100件目     [ ... 15 16 17 18 19 20 21 22 23 24 ... ]

PHPでは、= =演算子でデータの比較をしたとき、0とfalse、0とnull、数値の0と文字列の"0"などは、trueが返される。 つまり、= =演算子による比較ではそれらは区別できない。 こういった仕様は、strpos関数の返り値のように0とfalseを区別しなければならないときに困ったことになる。

そんなときのために、= = =演算子というものがある。 = =演算子が緩やか比較をするのに対して、= = =演算子は厳密な比較をする。 具体的には、データの型(int, string, floatなど)が一致するかどうかもチェックする。

既に、いくつかのデータでそれぞれの比較をした結果表がマニュアルにあるのだが、その表にないデータを追加したものを作ってみた。 さらに、マニュアルの表は、結果をTRUE,FALSEで書いているのに対して、比較の結果としてtrueが返されるところに○、falseが返されるところに空白( )を出力するようにしたり、JavaScriptでマウスがある行、列に色を付けて見やすくしてみた。

厳密なデータの比較表ソース表示

この結果で特に注目すべき点は
  • "0"と""は、trueと緩やかな比較をした結果がfalseになる。
  • (false = = array())と(false = = "")がtrueでも、(array() = = "")はtrueにならない。
  • (array(0) = = array(null))がtrueになるあたりから、おそらく配列内の値でも緩やかな比較が行われている。
  • (0.0 = = true)や("0" = = true)はfalseだが、("0.0" = = true)はtrueである。
  • (0 = = = 0.0)はfalseである。
  • INF同士またはNAN同士は、= =ではfalseになるが、= = =はtrueになる。
の6つだ。

この点を頭に入れておかないと、バグにはまったり、セキュリティホールを作ることもありえるので注意したい。


Visual Studio 2008(英語版)、.NET Framework 3.5の開発が完了し、Visual Studio 2008 Express Edition(英語版)の無償でのオンライン ダウンロード提供が開始された。 Visual Studio 2008では、2005にはあったJ#が消え、新しくWeb Developerが追加された。 日本語版の提供はまだなので、Express Editionの英語版をインストールしてみた。


PHPには、関数名を引数に取る関数がいくつかあるが、クラスのメソッドを渡すこともできる。 クラスの静的(static)なメソッドを渡したい場合には、関数名を文字列で渡していたところに、array(クラス名, 静的メソッド名)を渡すとうまくいく。

例えば、call_user_func関数では以下のようにする。

<?php
class MyClass {
	static public function ClassMethod(){
		echo '静的メソッド';
	}
}

call_user_func(array('MyClass', 'ClassMethod'));
?>

オブジェクトのメソッドを渡したい場合には、array(オブジェクト, メソッド名)で渡すとうまくいく。

<?php
class MyClass {
	private $var;
	public function __construct($str){
		$this->var = $str;
	}
	public function ClassMethod(){
		echo $this->var.'オブジェクトメソッド';
	}
}

$obj = new MyClass('test');
call_user_func(array($obj, 'ClassMethod'));
?>

このように関数名の変わりにクラスのメソッドが渡せるのはcall_user_func関数だけでなく、usort関数array_walk関数array_map関数などでも同様に渡すことができる。 静的メソッドであればcall_user_func('MyClass::ClassMethod')のような方法でも渡すことができそうな気はするが、残念ながらそれはできない。


PHPで開発してるときに、ふと「リダイレクトは絶対URLで書かなきゃいけないんだったかな?」と思った。 相対パスでもたいていのブラウザは動くが、動かないのもあるだろうし、相対パスの場合と絶対URLの場合を逆に覚えていたらめんどうなことになるので調べてみた。

最後の1つだけ違うが、それ以外は絶対URL推奨という話。 古いブラウザが中心になるようだが、意外と相対パスのリダイレクトに対応していないものが多い。 絶対URLで書くのが正しいようだし、基本的には絶対URLで書き、もし絶対パスがダメな場合があるようであれば、ユーザエージェントなどにより場合分けするのが良さそうだ。
相対パスでなければならないというのは上記のau+SSLのケースしか見つからなかったが、もしかして「モバイルWeb開発に失敗しない鉄則」 - @ITの「絶対URLでリダイレクトを行う際の注意」のような特殊な状況が原因だったりしないだろうか? これがなければ、全て絶対URLでも良さそうなのだが・・・。


JavaScriptでPHPのhtmlspecialchars関数と同じ動作をする関数がないか探していたところ、それとは関係ない記事だが「htmlspecialchars/htmlentitiesの正しい使い方」という記事を見つけた。

htmlspecialcharsとhtmlenties関数はENT_QUOTESを指定しないとENT_COMPAT(セキュリティ上問題があるが互換性を維持)が指定された状態と同じ動作をします。

な・・・・・なんだってーーー!?

htmlspecialchars関数使いまくってるのに・・・・・修正箇所多すぎw

オレ\(^o^)/オワタ



・・・・・・と思ったが、どうやらシングルクォートを変換しないだけのようなので、ダブルクォートで囲まれている部分なら問題ないようだ。 HTMLタグの属性値は全てダブルクォートで囲ってるし、JavaScriptの一部が心配なくらいだ。 それでも文字エンコーディングの指定をしていない問題はあるから、重要なプログラムだけでも書き換えようとは思う。

そういえば、マニュアルに

ENT_QUOTES が設定されている場合のみ、 ''' (シングルクオート) は '&#039;'になります。
なんて書いてあったのを見た気がする・・・。

当時はPHPを覚えたばかりで意味を理解できず、第2引数なしで今まで使い続けてた・・・。

orz


132件中 96-100件目     [ ... 15 16 17 18 19 20 21 22 23 24 ... ]