isStripSlashes = $isStripSlashes; $this->escapeType = $escapeType; $this->source = &$source; } ### Метод для экранирования строк ### Может экранировать сразу массив строк, для этого используется рекурсия protected function escape($index){ // Если данные на входе являются массивом, то заменяем его обЪектом if (is_array($this->source[$index])) return new self($this->source[$index], $this->escapeType, $this->isStripSlashes); // Если нет то экранируем входящие данные else{ // Копируем нужный элемент $element = $this->source[$index]; // Если включены магические кавычки, то сносим их нафик if (get_magic_quotes_gpc() && $this->isStripSlashes) $element = stripslashes($element); // Если $escapeType является функцией, то применяем её к элементам массива $escapeType = $this->escapeType; if (is_callable($escapeType)) $element = $escapeType($element); // Иначе выбираем режим экранирования из существующих else switch($escapeType){ // Для БД case self::MYSQL: $element = self::MySQLEscapeString($element); break; // Для вывода в браузер case self::HTML: $element = htmlspecialchars($element, ENT_QUOTES); break; // Приведение к целому типу case self::INT: $element = (int)$element; break; } } // Возвращаем обработанные данные return $element; } ### Метод - аналог mysql_real_escape_string ### Понадобилась, т.к. стандартная требует подключение к бд, ### а класс иногда предполагается использовать до подключения protected static function MySQLEscapeString($str){ // Заменяем опасные символы $str = str_replace("\\", "\\\\", $str); $str = str_replace("'", "\'", $str); $str = str_replace('"', '\"', $str); $str = str_replace("\x00", "\\x00", $str); $str = str_replace("\x1a", "\\x1a", $str); $str = str_replace("\r", "\\r", $str); $str = str_replace("\n", "\\n", $str); // Возвращаем обработанную строку return $str; } ### Метод для преобразования обЪекта в строку ### Нужна для того, чтобы обЪект вёл себя как массив public function __toString(){ return "Array"; } ### Методы для реализации интерфейса Iterator ### См. описанние итерфейса тут http://ru.php.net/manual/en/class.iterator.php public function rewind(){ reset($this->source); } public function current(){ return $this->escape($this->key()); } public function key(){ return key($this->source); } public function next(){ return next($this->source); } public function valid(){ return array_key_exists($this->key(), $this->source); } ### Методы для реализации интерфейса ArrayAccess ### См. описанние итерфейса тут http://ru.php.net/manual/en/class.arrayaccess.php public function offsetExists($offset){ return isset($this->source[$offset]); } public function offsetGet($offset){ return $this->escape($offset); } public function offsetSet($offset, $value){ $this->source[$offset] = $value; } public function offsetUnset($offset){ unset($this->source[$offset]); } ### Метод для реализации интерфейса Countable ### См. описанние итерфейса тут http://ru.php.net/manual/en/class.countable.php public function count(){ return count($this->source); } } ?>