Zend_Validate の挙動

Zend_Validate_NotEmpty の挙動

Zend_Validate_NotEmpty で 0 は false と判定される。

35.2.16. NotEmpty
$value が空の値でない場合にのみ true を返します。

http://framework.zend.com/manual/ja/zend.validate.set.html#zend.validate.set.not_empty

ドキュメントにはこうかいてある。


ソースを見てみた。

<?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 を返します。
次のような値は空であると考えられます。:

  • "" (空文字列)
  • 0 (0 は整数)
  • "0" (0は文字列)
  • NULL
  • FALSE
  • array() (空の配列)
  • var $var;(変数が宣言されているが、クラスの中で値が設定されていない)
http://jp2.php.net/manual/ja/function.empty.php

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
文字列 $value の長さが最小値以上、 かつ最大値以下 (最大値が null 以外のとき) の場合にのみ true を返します。 バージョン 1.1.0 以降では、setMin() で最大値より大きい値を指定したり setMax() で最小値より小さい値を設定したりした場合に例外をスローします。 バージョン 1.0.2 以降では、このクラスは UTF-8 のほかに iconv.internal_encoding にもとづいたその他の文字エンコーディングもサポートします。

http://framework.zend.com/manual/ja/zend.validate.set.html#zend.validate.set.string_length

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 に変更してやると、文字数でチェック掛けてくるようになった。