
Поздравьте меня, теперь я - Zend Certified Engineer :)
Экзамен сдавал в Москве, в центре тестирования Интерфейс. Очень хороший, внимательный и отзывчивый персонал. Пришел раньше, меня напоили кофе пока регистрировали, потом отвели в отдельный кабинет с видеокамерами и начался тест :) Скажу сразу, что реальный тест мне показался более сложным чем тестовые которые можно купить на сайте Zend, и к концу теста я был уверен что завалил :) Но оказалось нет, видимо интуиция спасла меня в тех вопросах, ответов на которые я не знал. В целом впечатление от теста непонятные - периодически настолько необоснованно сложные вопросы были, что я разводил руками… Вопросы плана “Какую оциональную переменную (константу) можно передать такой-то функции, чтобы получилось то-то”. Причем функции супер-редкие, которые не так часто используются. Я считаю что программист - это всетаки не тот, кто вызубрил названия всех функций и аргументов к ним, а тот кто может адекватно проектировать ПО, и грамотно пользоваться мануалами при написании. Не понимаю к чему такое фанатичное стремление сделать из программиста живой мануал по языку.
Но в целом, спасибо Zend’у, Pearson Vue, и Interface.ru - благодаря вам, я - второй в Казахстане сертифицированный PHP Developer :)
P.S. Если кто планирует сдавать - пишите в каменты, я могу выложить набор книжек в PDF для этого дела.
На часах 7.42 утра, а я еще не уходил с работы… Очень срочно нужно доделывать проект, в 11 утра презентация.
Зато параллельно с работой над этим проектом нашел очень неприятный баг в Kohana, заключается он в том что глобальный XSS фильтр, на который многие пользователя надеются, не работает. Совсем.
Подробнее здесь
PHP фреймворк Kohana о котором я уже писал обновился наконец до полноценной версии 2.0. Для тех кто не в курсе, версия 1.0 была по сути копией CodeIgniter’a, и никаких особых бенефитов не давала.
Теперь же полноценный релиз, новый сайт фреймворка, и ожидание нормальной документации. Пробую её в своём новом проекте, посмотрим что из этого получится. По возможности буду описывать свои впечатления.
Пока нравятся следующие вещи (в сравнении с CodeIgniter):
- Helpers теперь статические объекты, т.е. есть имитация чего-то вроде NameSpace’ов. Таким образом вы можете иметь одноименные методы в разных хелперах, наследовать их и прочее.
- Поддержка только PHP5. Это очень хорошо, что многие вещи делаются без оглядки на поддержку php4. Я в своих проектах использую только php 5.2+, так что поддержка php4 мне абсолютно не нужна.
- Продуманное именование контроллеров и моделей, таким образом мы можем иметь одноименные модели и контроллеры, в CI приходилось делать например контроллер News, и модель к нему NewsModel. Теперь благодаря тому что контроллеры долдны назваться NAME_Controller, а модели NAME_Model, мы можем иметь одноименные модели и контроллеры. Кроме того, логичнее сделано наследование системных классов. Все системные классы имеют суффикс _Core, хотя в вашем коде эти суффиксы нигде не используются. Т.е. скажем ваш контроллер имеет такое определение:
class Welcome_Controller extends Controller {
}
и создав половину контроллеров вы вдруг решили что вам нужно переопределить этот родительский контроллер, унаследовав системный и добавив некоторые функции. В CodeIgniter’e вам бы пришлось создать класс с таким кодом:
class MY_Controller extends Controller {
}
и описывать работу в нем, а во всех своих контроллерах менять class X extends Controller на class X extends MY_Controller. Теперь же, с учетом того что системные классы имеют суффикс _Core, вы просто переопределяете класс Controller таким образом:
class Controller extends Controller_Core {
}
и больше нигде ничего менять не нужно, потому что у вас и так везде шло наследование от класса Controller, просто вместо него подставлялся Controller_Core
Вобщем сделали многое чуть лучше, минусов пока я вижу всего три:
- Очень слабая документация, т.е. её практически нет, только API автоматически сгенерированный из кода
- Слабое по сравнению с CI комьюнити, ввиду малой распространенности
- Есть еще один минус на мой взгляд - этот фреймворк контроллируется комьюнити, а соответственно он очень сильно уязвим к кривым рукам, людей которые не получают за работу над ним заработную плату. Спорно конечно, может быть это и плюс, но мне кажется что CI всетаки более безопасный в этом плане, и количество потенциальных багов в нем должно быть на порядок меньше чем в аналогичном продукте от сообщества энтузиастов.
Хочу сам не забыть посмотреть, и с вами поделиться заодно:
Framework.php (Frog)

Маловато конечно, но будем расти дальше :)
Picora - еще один мелкий фреймворк, который стоит посмотреть. В стиле RoR, но на php.
Жаль что я его вовремя не увидел :)
Навел меня на него Alex, за что ему огромное спасибо :)
Работая с PDO обнаружил такую фишку - все объекты *LOB в оракле он не выбирает при fetch, а вместо этого выдает ссылку на объект типа (stream). Это PHP stream, чтобы его получить нужно выполнить stream_get_contents(). Понятно зачем это сделано, все к оптимизации и удобству, но я бы опционально разрешил вернуть все назад, и выбирать LOB’ы сразу в значения, как это делал например PEAR:DB.
В итоге чтобы выбрать текст новости из поля типа CLOB в Oracle мне пришлось делать так:
function getNewsContent($id) {
$newsq = $this->DBO->prepare("select id,subject,news_body,create_date from news where id=:id");
$newsq->execute(array(":id" => $id));
$newsq->bindColumn(3, $news_body, PDO::PARAM_LOB);
$data = ($newsq->fetch(PDO::FETCH_OBJ));
$data->NEWS_BODY = stream_get_contents($news_body);
return $data;
}
Немного не удобно, но привыкнуть можно.
Кроме того, бился сегодня головой об стену, по поводу того что выбирая фреймворк не наткнулся на Kohana
Она еще конечно сильно бета, но этот фреймворк по заявкам разработчиков - именно то что мне нужно. Там и PDO, там и memcached… Эх, вот всегда так…
Вы все еще полагаете что в мануале CodeIgniter’а не врут о том что метод $this->db->escape(); спасет вас от Sql Injection?
Учитывая что содержание этого метода в драйвере для Oracle
function escape_str($str)
{
return $str;
}
Доверяй, но проверяй :))