Pull to refresh
44
0
Send message

Прекрати злоупотреблять массивами в PHP

Reading time4 min
Views25K
php arrays everywhere

Меня давно мучает мысль об одной проблеме — тотально злоупотребление массивами в PHP. Возможно корень проблемы в процедурном наследии PHP или в том, что PHP привлекает большое количество неопытных разработчиков, не знаю. Но дело в том, что очень многие используют массивы там, где должны использоваться объекты!

Взглянем на типичный пример ужасающего, на мой взгляд кода, злоупотребляющего массивами. Для примера, предположим, мы извлекаем данные из БД и работаем с ними посредством массива. Вот такие примеры я вижу ежедневно:
Читать дальше →
Total votes 45: ↑22 and ↓23-1
Comments131

Когда использовать статические методы

Reading time2 min
Views26K
tl;dr Использовать ли статические методы? Да, когда они не зависят от внутреннего состояния объекта.

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

Статические методы по сути своей просто способ организации глобальных функций в пространства имен. Использование пространств имен, я думаю, вы согласитесь — хороший тон. Что касается глобальных функций — мы используем их всегда, встроенные функции PHP составляют основу нашего кода.

Основная проблема здесь — отсутствие совместно используемого глобального состояния. Вот пример из прошлого поста:

<?php
$time = Time::from("11:45");

В данном примере возвращаемый результат свободен от побочных эффектов и вполне предсказуем, т.к. зависит только от аргументов, подаваемых на вход. Каждый раз при вызове метода вам будет возвращен идентичный результат (объект Time со значением 11:45), вне зависимости от состояния системы, контекста или чего-либо еще.
Читать дальше →
Total votes 17: ↑13 and ↓4+9
Comments44

Как использовать именованные конструкторы в PHP

Reading time3 min
Views23K
tl; dr — Не ограничивай себя одним конструктором в классе. Используй статические фабричные методы.

PHP позволяет использовать только один конструктор в классе, что довольно раздражительно. Вероятно, мы никогда не получим нормальную возможность перегрузки конструкторов в PHP, но кое-что сделать все же можно. Для примера возьмем простой класс, хранящий значение времени. Какой способ создания нового объекта лучше:

<?php
$time = new Time("11:45");
$time = new Time(11, 45);

Правильным ответом будет «в зависимости от ситуации». Оба способа могут являются корректным с точки зрения полученного результата. Реализуем поддержку обоих способов:
Читать дальше →
Total votes 25: ↑20 and ↓5+15
Comments97

Перевод книги «Выразительный Javascript» в pdf

Reading time1 min
Views192K
Хабр, привет.

Не так давно SLY_G опубликовал цикл переводов книги Eloquent Javascript (за что ему большое спасибо). В комментариях раз за разом поднимались вопросы о сборке переводов книги, что, собственно, я и сделал при помощи сервиса Gitbook — «Выразительный Javascript», pdf, ePub, mobi и онлайн версия.

Репозитарий книги, pull requests принимаются.
Читать дальше →
Total votes 81: ↑81 and ↓0+81
Comments36

HHVM 3.3 — первый релиз с долгосрочной поддержкой (LTS)

Reading time2 min
Views9.3K
imageHHVM известен своей высокой скоростью развития: в настоящее время на Github попадает тот же код, что и используется для Facebook, а версии выпускаются каждые 8 недель. Это впечатляет, хотя и отталкивает, если думать об этом в контексте построения бизнеса или инфраструктуры.

Команда HHVM понимает, что для того, чтобы добиться большего охвата пользователи должны получить своего рода обязательство для того, чтобы быть уверенными в стабильности и безопасности уже выпущенных версий.
Читать дальше →
Total votes 22: ↑21 and ↓1+20
Comments3

Обработка POST запросов AngularJs в Symfony2

Reading time2 min
Views17K
Примечание
Давненько уже читал пост на хабре, о сабже в контексте php, и все руки не доходили на Symfony2 привести это в какой-то красивый вид, а тут в недавнем дайджесте наткнулся на простое решение, которое здесь и представлено.


Использование Symfony2 и AngularJs в связке является хорошей идеей, но есть одна проблема — решение из коробки обладает проблемой в коммуникации. В этом посте будет рассказано о том, как автоматически декодировать JSON-запросы и использовать полученные данные при помощи Request Symfony используя библиотеку symfony-json-request-transformer (на самом деле всего-то один класс).
Мокрая киска под катом
Total votes 21: ↑17 and ↓4+13
Comments14

Вышел финальный релиз PHP 5.6.0

Reading time1 min
Views56K


Сегодня, 28 августа, команда разработчиков PHP объявила об релизе версии 5.6.0!

Основные нововведения PHP 5.6.0:

Читать дальше →
Total votes 65: ↑63 and ↓2+61
Comments64

XSS-game от Google

Reading time1 min
Views35K
Google представил игру, заключающуюся в поиске xss-уязвимостей, c целью распространения информации об этом наиболее опасном и распространенном типе уязвимости. Google так серьезно относится к обнаружению уязвимостей, что платит до $7500 за серьезные xss.



Ну а игра покажет как выявлять xss, это знание поможет вам предотвращать ошибки в ваших приложениях. Всего в игре 6 уровней, в случае затруднения в выполнении заданий можно воспользоваться подсказками. По прохождению игры обещают тортик.

Заметка короткая, под кат не убираю, разомните мозги в этот выходной день! Я вот без подсказок осилил только 1-й уровень, с подсказками дошел до 6-го, дальше пока никак.

Ну-ка, сыграем.
Total votes 85: ↑83 and ↓2+81
Comments65

Отладка электронной почты при помощи MailCatcher

Reading time4 min
Views24K
imageВы используете в своем приложении электронную почту, не так ли? Это, в общем-то, риторический вопрос, конечно используете. Ей уже больше 30 лет, а это по прежнему самое популярное средство коммуникации на планете. Вот некоторые статистические данные от Pingdom:
  • 2,2 млрд. — Количество пользователей электронной почты по всему миру
  • 144 млрд.- Объем отправляемых электронных писем ежедневно во всем мире
  • 4,3 млрд.- Количество почтовых клиентов во всем мире

Потрясающе!

Зачем нужна эта статья?


По одной простой причине, с которой мы все так или иначе сталкиваемся. Необходимо тестировать функционал как можно ближе к реальному применению, и любая ошибка может привести к тому, что наши клиенты получат тестовые письма, и это будет печально.

Я уверен, вы знаете о чем я говорю. Думая, что перевели приложение в режим отладки, вы запускаете тест, который отправляет письма из вашего приложения. Вы думаете что никто кроме вас не увидит эти письма.

Тесты проходят, вы хвалите себя и продолжаете работу. Но спустя некоторые время вы получаете звонок от своего заказчика. Он жалуется, что его клиенты получили странные. Он расстроен и хочет получит ответ.

Было такое? Не хочется, чтобы повторилось? Есть решение — MailCatcher. Если вы не слышали о нем то вкратце:
… Супер-простой SMTP-сервер, который перехватывает любое отправленное сообщение и выводит его в веб-интерфейсе. Запустите mailcatcher, в настройках вашего приложения укажите smtp://127.0.0.1:1025 вместо SMTP-сервера по умолчанию, и затем просматривайте почту, которая была отправлена по адресу 127.0.0.1:1080


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

Сейчас я хочу показать вам, как настроить, запустить и использовать MailCatcher.
Ну-ка, поглядим...
Total votes 27: ↑23 and ↓4+19
Comments17

Делегирование событий в AngularJS. Попытка разобраться

Reading time2 min
Views14K
Евгений Гришковец, спектакль 'Как я съел собаку'Гришковец как бы говорит нам «А давайте разберемся»

В комментариях к статье мною был задан вопрос о делегировании в AngularJS в контексте того, что привычный многим императивный способ назначения обработчика для группы элементов аля

$('ul').on('click', 'li', function(){ // обработчик ....

не совсем приемлем в декларативном AngularJS. Собственно, последовал совет использовать свою директиву, решающую проблему делегирования. На самом деле, на ум мне ничего толкового не пришло, и я решил погуглить, наткнулся на такой вариант: создаем директиву, которую необходимо установить на родительский для группы нужных нам элементов узел, который регистрирует слушателя.
Вот демо.
А вот 2 интересующие нас части кода:
html
<ul bn-delegate="li a | selectFriend( friend )">
 
        <li ng-repeat="friend in friends">
 
            <!-- Delegate target. -->
            <a href="#">{{ friend.name }}</a>
            <!-- Delegate target. -->
 
        </li>
 
    </ul>


//js
                    element.on(
                        "click.bnDelegate",
                        selector,
                        function( event ) {
 
                            // Prevent the default behavior - this is
                            // not a "real" link.
                            event.preventDefault();
 
                            // Find the scope most local to the target
                            // of the click event.
                            var localScope = $( event.target ).scope();
 
                            // Invoke the expression in the local scope
                            // context to make sure we adhere to the
                            // proper scope chain prototypal inheritance.
                            localScope.$apply(
                                function() {
 
                                    expressionHandler( localScope );
 
                                }
                            );
 
                        }
                    );


Но подождите. В зависимостях получается jQuery (можно обойтись без него, но тем не менее), но это пол беды. В дебрях директивы все тот же императивный подход. Собственно, в этот момент я решил опубликовать пост, с попыткой разобраться в подходах к делегированию в Angular, в комментарии призываются все, кому есть что сказать по этому поводу.
Читать дальше →
Total votes 26: ↑20 and ↓6+14
Comments20

Использование директив ngShow и ngHide в AngularJS

Reading time3 min
Views52K
Сегодня мы посмотрим на то, как можно использовать директивы ngShow и ngHide в Angularjs.

Зачем они нужны


ngShow и ngHide позволяют отображать или скрывать различные элементы. Это помогает при создании Angular-приложений, так как наши SPA, скорее всего, будут иметь много частей, которые, в зависимости от состояния нашего приложения необходимо скрывать или показывать.

Большим преимуществом этих директив является то, что нам нет необходимости скрывать или показывать элементы при помощи CSS или JavaScript. Это все обрабатывает старый добрый Angular.

Использование


Чтобы использовать ngShow или ngHide, нужно просто добавить директиву к элементу, который вы хотите показать или скрыть.
Читать дальше →
Total votes 18: ↑12 and ↓6+6
Comments18

Бренден Айк ушёл с поста руководителя Mozilla под давлением ЛГБТ

Reading time1 min
Views85K
Бренден Айк был вынужден покинуть пост руководителя (CEO) компании Mozilla. Решение принято в свете травли, устроенной представителями сексуальных меньшинств, недовольных тем, что Бренден Айк был приверженцем традиционных взглядов на семейные отношения. Травля дошла до того, что некоторые подконтрольные ЛГБТ сайты, в том числе один из крупнейших сайтов знакомств (OKCupid), стали блокировать доступ пользователей Firefox, предлагая сменить браузер, так как Бренден Айк шесть лет назад пожертвовал тысячу долларов на продвижение поправки в конституцию штата Калифорнии, определяющей брак только как союз между мужчиной и женщиной.
Заметка короткая, под кат немного не поместилась
Total votes 189: ↑164 and ↓25+139
Comments979

Простая сборка виртуальных машин с помощью PuPHPet

Reading time8 min
Views37K

Создание и управление средами разработки расстраивает вас, замедляет работу или отвлекать вас от разработки? У вас возникают трудности из-за того, что ваше локальное окружение и окружение при деплое отличаются? Если это так, у меня есть для вас решение — PuPHPet!

Введение


Я не могу с уверенностью сказать за вас, но одна из моих любимых мозолей* в разработке — это окружение, будь то создание и поддержание его для различных проектов с различными потребностями, обеспечение взаимодействия команды разработчиков, (особенно, распределенной), или настройка сред для разработки, тестирования и боевого окружения. Все это может быть трудоемкой задачей, особенно когда выполняется вручную.

В зависимости от требований руководства или клиентов разнообразие вариантов выбора может вогнать в депрессию. Все они могут тянуть в разные стороны (и тянут!), зачастую одновременно.
Читать дальше →
Total votes 40: ↑35 and ↓5+30
Comments18

Как в вашей компании обстоит дело с учебными отпусками?

Reading time1 min
Views16K
В связи с надвигающейся сессией, а также недавними постами о ВУЗах возник сабжевый вопрос. Интересен ответ по отношению к официально устроенным сотрудникам, обучающимся заочно и имеющим право на учебный отпуск (ст. 173 ТК РФ).

Подсказать возможные варианты, высказать своё мнение — прошу в комментарии.
Total votes 21: ↑14 and ↓7+7
Comments37

Codeacademy анонсировала курс по изучению PHP

Reading time1 min
Views16K


Прислушавшись к многочисленным просьбам команда Codeacademy выпустила курс по изучению PHP — одного из самых популярных языков программирования.

$action = $_GET['PHP Courses'];

К сожалению, сейчас есть только базовый курс PHP и Codeacademy призывает всех помочь дальнейшему развитию курса PHP.
Total votes 55: ↑43 and ↓12+31
Comments16

Обзор песочницы с 16 по 22 марта

Reading time3 min
Views9.2K
Здравствуй, %username%. До нового года dreddik выступил с интересной инициативой еженедельных обзоров песочницы. И вот сегодня, маясь от безделья и перечитав уже все статьи, вспомнил про песочницу и решился сделать такой обзор. Я выбрал наиболее интересные на мой взгляд статьи и хочу представить их вам. На самом деле статей с нового года скопилось очень и очень много. Есть откровенно слабые, есть очень достойные, но делать обзор всех подряд статей я не вижу смысла, это и трудоемко, да и читать будет просматривать обзор будет утомительно. Хочу сделать небольшой опрос чтобы понять — нужно ли продолжать делать такие обзоры.
Поглядим, что там интересного
Total votes 80: ↑65 and ↓15+50
Comments24

Взлом тега в 100 символов

Reading time3 min
Views24K
Не так давно я обнаружил, что JavaScript позволяет изменить атрибут href тега <a> после того, как вы щелкнете по нему. На первый взгляд это выглядит несерьезно, но не сомневайтесь — таким способом злоумышленник сможет получить данные пользователя.

Позвольте вам продемонстрировать: (Прим. пер.: Пример вы можете увидеть в оригинале статьи. Ссылка изначально ведет на PayPal, но после нажатия происходит редирект на другую страницу блога автора. )

Как вы убедились, вы не перешли на PayPal (кроме Opera, где, по-видимому, это поведение исправлено). Так произошло потому, что после нажатия на ссылку был запущен код, который изменил атрибут href ссылки, и что удивительно — браузер отправляет по-новому адресу. Но так не должно происходить. Посетители сайта (пожалуй, самые технически подкованные их них) по ссылке будут предполагать куда они переходят, в данном случае, на сайт PayPal. В прошлом году PayPal в течение нескольких месяцев производил редирект с главной страницы (UK) на paypal-business.co.uk. По моему мнению, пользователи уже привыкли к таким перенаправлениям, что уже само по себе является уязвимостью и представляет реальную угрозу, как я её называю «Фишинг 2.0».
Взглянем на код
Total votes 120: ↑72 and ↓48+24
Comments64

«Смс не надо» — сервис позволяющий отписаться от назойливых смс-рассылок

Reading time3 min
Views37K

Здравствуй!
Тема борьбы с нежелательной смс-рекламой на Хабре поднималась уже не раз[1]. Хочу внести свой небольшой вклад в дело борьбы с многоголовой гидрой спама.

Я, как и наверное многие, частенько получаю смс сообщения с «ненавящевой» рекламой такси, кредитов, фитнес-центров и прочих радостей жизни. И вот сегодня наткнулся на сервис smsnenado.ru[2], предлагающий отписаться от смс-рассылок.
%username%, я к данному сервису не имею никакого отношения, предупреждаю сразу

Когда увидел репост новости о данном проекте — отнесся скептически, но любопытство пересилило, и я пошел в разведку.
Итак, разведка боем
Total votes 115: ↑99 and ↓16+83
Comments99

Копирование текста в буфер обмена с помощью jQuery плагина zClip

Reading time2 min
Views34K


При разработке сайта была поставлена не совсем стандартная задача — копировать по клику на текстовое поле его содержимое. Поиск подсказал что кроссбраузерно и с наименьшими потерями времени копирование в буфер обмена при помощи javascript возможен с применением плагинов jQuery использующих flash. Может это и не самое правильное решение, но остановились на нем. Я хочу рассказать об опыте использования плагина zClip, его настройке, попавшимися и решенными проблемами.

О этом плагине уже была статья на Хабре — Копируем в буфер обмена в FireFox 3.5 и IE8, но она местами устарела. Опытные разработчики не найдут здесь чего-то нового и очень уж интересного, остальных прошу под кат.
Читать дальше →
Total votes 20: ↑10 and ↓100
Comments8

Information

Rating
Does not participate
Registered
Activity