Как стать автором
Обновить

Комментарии 22

 все это хорошо. самп ользуюсь многими из этих функций.
вот только не пойму, чем их РНР-шная функция round(25.02558, 3) не устроила, что они решили использовать precision(25.02558, 3);
precision — это sprintf("%01.3f", 25.02558)
round(25.0000,3) = 25 (float)
sprintf("%01.3f", 25.02558) = 25.000 (string)
> sprintf("%01.3f", 25.02558) = 25.000 (string)
sprintf("%01.3f", 25.0000) = 25.000 (string)
результат sprintf зависит от локали и иногда это может сыграть негативную роль (например, когда значение потом попадает в Javascript, или вообще, если впоследствии оно используется и программа приводит его к типу float).

В сочетании со слабой типизацией в PHP это может дать нехорошие результаты, так что будьте осторожны и никогда не используйте результаты sprintf в вычислениях.

Лично мне приходилось, работая с legacy-кодом — делать setlocale(LC_NUMERIC, 'C'); — чтобы избежать подобных ошибок.
ну в данном случае речь идет о хелпере, а значит в вычислениях результат работы precision использоваться не должен по определению, только для отображения.
хотя про то, что локаль влияет на вывод sprintf я чет даж не подумал. пригодится, спасибо.
сори =)
так вот описано как stripLinks() убирает ссылки, но это и так понятно, куда более интересней — как autoLinkUrls() добавляет?
еще раз извиняюсь. в действительности все банально просто…
Сапсибо за статью. Сейчас как раз занимаюсь изучением CakePHP. После CodeIgniter довольно непривычно.
не понимаю, зачем дублировать встроенные функции?
чтобы разработчик вынужден был разбираться в сотнями новых оберток)
внутри функции реализованны не фонтан )
например toList() функция из 9-ти строчек…

function toList($list, $and = 'and') {
	$r = '';
	$c = count($list) - 1;
	foreach ($list as $i => $item) {
		$r .= $item;
		if ($c > 0 && $i < $c) {
			$r .= ($i < $c - 1 ? ', ' : " {$and} ");
		}
	}
	return $r;
}

хотя тоже самое можно сделать двумя, без всяких циклов:

function toList_upgrade($list, $and='and') {
	$last = sizeof($list)>1 ? " {$and} ".array_pop($list) : '';
	return implode(', ', $list).$last;
}

тоже самое и с остальными…
сложные функции конечно лучше брать готовые, а такие простые уж набросать дело нескольких минут.
что-то мне подсказывает, что implode работает так же, как и конкатенация в toList()
1) в любом случае, implode склеит массив быстрее чем перебор и склеивание вручную
2) да и объем функции уменьшился в два раза.
да и дело даже не в этом.
а в том что фреймворки стали модными, а встроенные в САМ язык функции некоторые так и не могут осилить, и городят трехэтажные функции, даже для элементарных задач (причем этим грешат и сами создатели фреймворков некоторых)
Почему вынужден? Не хочет — пусть не использует.
неплохо бы такие хелперы выделять в отдельную библиотеку, чтобы пользоваться могли им и в других фреймворках
Можно скопировать файлик с хелпером и подключать его в своих приложениях. Никто мешать не будет))
ну мало ли, вдруг к этим файлам нужны другие файлы, а к ним третьи. если вы когда нибудь устанавливали проги под *nix, то поймете какой это гемор :)
а тут маленькая библиотечка хелперов без левых зависимостей
Согласен с вами, особо не углублялся в архитектуру кейка но метод наследования классов там немного закручен и не так очевиден как в зенде. Меня раздражает тот факт что в большинстве случаев необходимо создавать обьект перед тем как вызвать какой нибудь метод скажем из хелперов, хотя ничего не мешает ему вызыватся статически.

вот пример:
function convert($serverTime, $userOffset) {
$serverOffset = $this->serverOffset();
$gmtTime = $serverTime — $serverOffset;
$userTime = $gmtTime + $userOffset * (60*60);
return $userTime;
}
почему бы не сделать так:

function convert($serverTime, $userOffset) {
return ($serverTime — self::serverOffset()) + $userOffset * 3600;
}

Сдается мне вы совсем не углублялись в структуру кейка. В большинстве случаев нет необходимости создавать объект чтобы вызвать метод.
А приведенный вами пример абсолютно ничего не показывает.

А что касается зенда так он больше похож на набор библиотек а не на фреймворк. Хотя в последнее время ситуация вроде улучшается.
Пытался но с 3х попыток не подружился полностью, решил собрать собственный велосипед на магнитной подушке %)
Может вы обьясните тогда, как воспользоваться тем же методом TimeHelper::convert($time,$ofset);
без классов AppHelper, Helper, Overloadable, Object?

А в своем примере я хотел подчеркнуть что serverOffset() целессобразней вызывать статически так как к обьекту она никакого отношения не имеет да и умножать 60*60 безсмысленная трата ресурсов.
Большинство методов будет работать без зависимостей. А вообще не составит большого труда узнать зависимости. Там не совсем *nix)
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации