Zend_Validate の挙動
Zend_Validate_NotEmpty の挙動
Zend_Validate_NotEmpty で 0 は false と判定される。
35.2.16. NotEmpty
http://framework.zend.com/manual/ja/zend.validate.set.html#zend.validate.set.not_empty
$value が空の値でない場合にのみ true を返します。
ドキュメントにはこうかいてある。
ソースを見てみた。
<?php /** * Defined by Zend_Validate_Interface * * Returns true if and only if $value is not an empty value. * * @param string $value * @return boolean */ public function isValid($value) { $valueString = (string) $value; $this->_setValue($valueString); if (empty($value)) { $this->_error(); return false; } return true; }
empty() を使って判定をかけている。
empty() は 数値の 0 はtrue と判定される。
#PHP の仕様
返り値
var が空でないか、0でない値であれば FALSE を返します。
次のような値は空であると考えられます。:http://jp2.php.net/manual/ja/function.empty.php
- "" (空文字列)
- 0 (0 は整数)
- "0" (0は文字列)
- NULL
- FALSE
- array() (空の配列)
- var $var;(変数が宣言されているが、クラスの中で値が設定されていない)
0 を入力して empty と判定されたくない場合もある。
そこで Zend_Validate_NotEmpty を継承して、isValid() をオーバーライドする。
<?php public function isValid($value) { $valueString = (string) $value; $this->_setValue($valueString); if (is_null($value) || mb_strlen($value) <= 0) { $this->_error(); return false; } return true; }
これで 0 は値として認識されるようになる。
Zend_Validate_StringLength の挙動
文字数の判定を掛けたくて使ってみたら、バイト数として判定されていたよう。
該当箇所のソースを見てみると、iconv を使用して変換かけていた。
35.2.18. StringLength
http://framework.zend.com/manual/ja/zend.validate.set.html#zend.validate.set.string_length
文字列 $value の長さが最小値以上、 かつ最大値以下 (最大値が null 以外のとき) の場合にのみ true を返します。 バージョン 1.1.0 以降では、setMin() で最大値より大きい値を指定したり setMax() で最小値より小さい値を設定したりした場合に例外をスローします。 バージョン 1.0.2 以降では、このクラスは UTF-8 のほかに iconv.internal_encoding にもとづいたその他の文字エンコーディングもサポートします。
iconv の文字コードを見てみると、
<?php var_dump(iconv_get_encoding('all'));
とすると結果が
array 'input_encoding' => string 'ISO-8859-1' (length=10) 'output_encoding' => string 'ISO-8859-1' (length=10) 'internal_encoding' => string 'ISO-8859-1' (length=10)
と表示された。
php.ini を見てみると、iconv の箇所がコメントになっていたので、
utf-8 に変更してやると、文字数でチェック掛けてくるようになった。