QuickForm валидация на клиенте и PHP5

crocodile2u

http://vbolshov.org.ru
QuickForm валидация на клиенте и PHP5

PHP-5.0.4.
При попытке использовать валидацию на стороне клиента возникает ошибка, причина которой в следующем коде (файл QuickForm/RuleRegistry.php):

PHP:
if (is_a($element, 'html_quickform_group')) {
...
}
Имя нужного класса на самом деле HTML_QuickForm_group - из-за этого неверно отрабатывает мой __autoload();

Проблема решилась заменой вышеприведенного куска кода на:

PHP:
/* Fix for PHP5 compatibility */
        if (PHP_VERSION < 5) {
        	$_is_group = is_a($element, "html_quickform_group");
        } else {
        	$_is_group = $element instanceof HTML_QuickForm_group;
        }
        if ($_is_group) {
...
}
Можно было просто заменить имя класса на верное (не lowercase), однако, is_a() - deprecated, так что я предпочел такое решение.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Уже неоднократно закрывал похожие "баги" со словами "ошибка в вашей функции __autoload? вот её и чините!"
 

crocodile2u

http://vbolshov.org.ru
Не соглашусь. Имя нужного класса - HTML_QuickForm_group, а не html_quickform_group - и функция просто физически не может получить из lowercase - действительное имя.

Нельзя сказать, что это баг, потому что писалось-то все под php4, но все же, если внести эти добавочные несколько строк, совместимость при переходе между версиями улучшается.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: crocodile2u
Не соглашусь. Имя нужного класса - HTML_QuickForm_group, а не html_quickform_group - и функция просто физически не может получить из lowercase - действительное имя.
Ошибка возникает в твоей функции __autoload()? Значит ошибка именно в ней, а не в QuickForm. А если на каждый баг в чужой программе добавлять в QuickForm обходные пути, то пакет окончательно распухнет.
 

crocodile2u

http://vbolshov.org.ru
Поразмыслив немного, пришел к выводу, что нужно лишь извиниться перед Sad Spirit.

Однако - вот что вызывает у меня недоумение:

PHP:
if (is_a($object, "myClass")) {..
Дело в том, что в 5-ке, если __autoload() определена, интерпретатор при вызове is_a() по автомату пытается сначала достать нужный класс, а потом уже смотреть, является ли первый аргумент is_a() его инстансом.

Такое поведение, на мой взгляд, просто нелогично.
Имеются два возможных случая:
1) Класс myClass уже определен _до_ вызова is_a() - в таком случае вполне логично использовать тот же instanceof - и все работает предсказуемо и логично
2) Класс myClass _не_ определен до вызова is_a(). В таком случае первый аргумент никак не может являться его инстансом.

Понятно, что функция - deprecated, но для backwards compatibility можно было бы, имхо, как-то по-другому построить ее алгоритм.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: crocodile2u
Понятно, что функция - deprecated, но для backwards compatibility можно было бы, имхо, как-то по-другому построить ее алгоритм.
Именно, я согласен, если PHP5-only оператор instanceof пользуется PHP5-only возможностью __autoload(), но нахрена было deprecated функцию is_a() трогать?..

К тому же, самому QuickForm'у никакой __autoload() не нужен, т.к. там все классы подгружаются до начала их использования.
 

crocodile2u

http://vbolshov.org.ru
Да, в общем, я действительно, не туда обращался с этой закавыкой :)

Впрочем, все это решаемо и без изменений в коде QuickForm.

Не совсем в тему:

Есть подозрение, что некоторые factory() и singletone() - методы в различных пакетах PEAR (и, само собой, не только PEAR) могут испытывать похожие трудности при переходе на 5-ку, особенно если используется __autoload().

Никто не испытывал подобных трудностей?
 
Сверху