php – Stepan Suvorov Blog https://stepansuvorov.com/blog Release 2.0 Sun, 02 Sep 2012 17:42:04 +0000 en-US hourly 1 https://wordpress.org/?v=6.3.1 Объектно ориентированный подход при работе с датой https://stepansuvorov.com/blog/2012/09/%d0%be%d0%b1%d1%8a%d0%b5%d0%ba%d1%82%d0%bd%d0%be-%d0%be%d1%80%d0%b8%d0%b5%d0%bd%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%bd%d1%8b%d0%b9-%d0%bf%d0%be%d0%b4%d1%85%d0%be%d0%b4-%d0%bf%d1%80%d0%b8/ https://stepansuvorov.com/blog/2012/09/%d0%be%d0%b1%d1%8a%d0%b5%d0%ba%d1%82%d0%bd%d0%be-%d0%be%d1%80%d0%b8%d0%b5%d0%bd%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%bd%d1%8b%d0%b9-%d0%bf%d0%be%d0%b4%d1%85%d0%be%d0%b4-%d0%bf%d1%80%d0%b8/#respond Sun, 02 Sep 2012 17:42:04 +0000 http://stepansuvorov.com/blog/?p=537 Continue reading ]]> Все мы раньше так или иначе использовали в PHP функцию date() для произведения необходимых манипуляций с датой. Она прекрасна и решает множество задач, но увы иногда, когда очень хочется использовать объектный подход, она выпадает. Существует множество пользовательских решений, которые представляют классс-оболочку Date для функции date(), что решает вопрос. Но как мы знаем в 5.2 версии языка наконец-то сообразили сделать встроенный родной класс, и имя ему DateTime. В общем-то был добавлена целая группу классов работы с датой, но DateTime – основной, поэтому его мы и разберем.

Для тех кто работал с объектом Date на Javascript думаю будет проще перейти на DateTime. Начнем с начала – создадим объект:

$oDate = new DateTime;

можно как оставить конструктор без параметров, так и задать необходимое значение:

$oDate = new DateTime('2012-09-02 11:48:15');

тут есть особенность: есть мы хотим указать время через unixtime – то должны переди ставить значок “@”:

$oDate = new DateTime('@1346586632');

Итак мы создали объект даты $oDate и теперь мы конечно захотим вывести его. Для этого есть специальный метод format(). Синтаксис аналогичен date():

echo $oDate->format('Y-m-d H:i:s');

Встроенного магического метода __toString() почему-то не сделали, думаю можем сами расширить, если постоянно необходимо выводить один и тот же формат даты:

class CDateTime extends DateTime{
  function __toString() {
    return $this->format('Y-m-d H:i:s');
  }
}

Тогда может будет просто вывести:

echo $oDate;

Что еще есть полезного в этом объекте? Еще есть 2 метода, которые позволяют удобно прибавлять и отнимать определенный временной промежуток:

$oDate->add(DateInterval::createFromDateString('10 days'));
$oDate->sub(DateInterval::createFromDateString('2 month'));

Вот таким способом мы прибавили 10 дней и отняли 2 месяца. Здесь стоит уделить внимание объекту нового для нас класса DateInterval, которые необходим для задания временного интервала. Создать мы его можем разными способами:

  • через метод createFromDateString
  • через параметр конструктора

Вот некое соответствие между ними:

параметр createFromDateString параметр конструктора
1 day P1D
2 weeks P2W
3 months P3M
4 years P4Y
1 year + 1 day P1Y1D
1 day + 12 hours P1DT12H
3600 seconds PT3600S

После создания данного объекта мы можем его менять обращаясь непосредственно к переменным:

$interval = DateInterval::createFromDateString('2 month');
$interval->h = 10; //задали значение часов

Очень интересно что вывод значения объекта осуществляется также через метод format(), [!Внимание] синтаксис для задания формата отличается от DateTime, и тут многие делают ошибку. Символы обозначения разрядов остались такие же(Y – год, m – месяц), но теперь перед каждым нужно добавлять значок “%”:

echo $interval->format('%Y years %m months %d days %H hours ...');

Оставшиеся функции, которые могут быть интересны:

DateTime::modify ( string $modify ) – по синтаксису функции strtotime()
DateTime::diff ( DateTime $datetime2) – вычисление расхождений дат

Также класс содержит константы необходимых форматов, например:

echo DateTime::W3C; //'Y-m-d\TH:i:sP'

 

По основному все. Если кто-то знает еще какую либо полезную информацию о использовании объекта DateTime – пишите.

]]>
https://stepansuvorov.com/blog/2012/09/%d0%be%d0%b1%d1%8a%d0%b5%d0%ba%d1%82%d0%bd%d0%be-%d0%be%d1%80%d0%b8%d0%b5%d0%bd%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%bd%d1%8b%d0%b9-%d0%bf%d0%be%d0%b4%d1%85%d0%be%d0%b4-%d0%bf%d1%80%d0%b8/feed/ 0
Примеры задач на собеседование для старших разработчиков https://stepansuvorov.com/blog/2012/07/%d0%bf%d1%80%d0%b8%d0%bc%d0%b5%d1%80%d1%8b-%d0%b7%d0%b0%d0%b4%d0%b0%d1%87-%d0%bd%d0%b0-%d1%81%d0%be%d0%b1%d0%b5%d1%81%d0%b5%d0%b4%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b4%d0%bb%d1%8f-%d1%81%d1%82/ https://stepansuvorov.com/blog/2012/07/%d0%bf%d1%80%d0%b8%d0%bc%d0%b5%d1%80%d1%8b-%d0%b7%d0%b0%d0%b4%d0%b0%d1%87-%d0%bd%d0%b0-%d1%81%d0%be%d0%b1%d0%b5%d1%81%d0%b5%d0%b4%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b4%d0%bb%d1%8f-%d1%81%d1%82/#comments Tue, 31 Jul 2012 08:43:05 +0000 http://stepansuvorov.com/blog/?p=370 Continue reading ]]> В случая, когда становится ясно, что человек очень легко справляется с задачами для начинающего разработчика, можно переходить к более серьезным вариантам.

PHP:

Необходимо задать так $a, чтобы следующее выражение

($a[0] === 1 && $a[0] === 2)

вернуло TRUE.

Подсказка: вопрос на понимание использования SPL.

JavaScript:

Необходимо так задать sum, чтобы выражение:

sum(3)(7)

вернуло сумму чисел переданных таким образом. И дополнение к задаче, кто сразу понял как решать первый вариант:

+sum(3)(7)...(5)

т.е. параметров может быть неограниченное количество.

Подсказка: В данной задаче поднимаются темы: создания объекта, замыкание, псевдостатические переменные, магические методы.

SQL:

Составить запрос по следующему условию:  в библиотеке на пронумерованных полках стоят книги разного цвета. Составьте запрос, который найдёт все полки в библиотеке, на которых стоят только красные книги.

Успешной подготовки!

]]>
https://stepansuvorov.com/blog/2012/07/%d0%bf%d1%80%d0%b8%d0%bc%d0%b5%d1%80%d1%8b-%d0%b7%d0%b0%d0%b4%d0%b0%d1%87-%d0%bd%d0%b0-%d1%81%d0%be%d0%b1%d0%b5%d1%81%d0%b5%d0%b4%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b4%d0%bb%d1%8f-%d1%81%d1%82/feed/ 5
PHP The Right Way. https://stepansuvorov.com/blog/2012/07/php-the-right-way/ https://stepansuvorov.com/blog/2012/07/php-the-right-way/#respond Sun, 29 Jul 2012 17:53:44 +0000 http://stepansuvorov.com/blog/?p=358
PHP: The Right Way

worth reading

]]>
https://stepansuvorov.com/blog/2012/07/php-the-right-way/feed/ 0
Отбор PHP кандидатов в нашей компании. https://stepansuvorov.com/blog/2012/07/%d0%be%d1%82%d0%b1%d0%be%d1%80-php-%d0%ba%d0%b0%d0%bd%d0%b4%d0%b8%d0%b4%d0%b0%d1%82%d0%be%d0%b2-%d0%b2-%d0%bd%d0%b0%d1%88%d0%b5%d0%b9-%d0%ba%d0%be%d0%bc%d0%bf%d0%b0%d0%bd%d0%b8%d0%b8/ https://stepansuvorov.com/blog/2012/07/%d0%be%d1%82%d0%b1%d0%be%d1%80-php-%d0%ba%d0%b0%d0%bd%d0%b4%d0%b8%d0%b4%d0%b0%d1%82%d0%be%d0%b2-%d0%b2-%d0%bd%d0%b0%d1%88%d0%b5%d0%b9-%d0%ba%d0%be%d0%bc%d0%bf%d0%b0%d0%bd%d0%b8%d0%b8/#comments Tue, 24 Jul 2012 12:34:04 +0000 http://stepansuvorov.com/blog/?p=326 Continue reading ]]> Думаю статья будет полезна тем, кто хочет подготовиться к собеседованию, но не знает за какую книжку схватиться.

Любой отбор начинается с небольшого письменного теста, который позволяет определить ваш приблизительный уровень. Тут не будет трудных вопросов: немного на понимание синтаксиса, типов и функций PHP; еще немного на тему javascript; и еще кусочек на составление запросов к базе данных.

Если вы успешно справились с тестом(это набрали хотя бы треть правильных ответов) – сразу же начинается второй этап – собеседование. Как правило интервью проводят 2 человека. Диалог начинается с вольной темы “Почему именно PHP?” или “Какие были интересные проекты?”. Далее идут вопросы по теории. Если вы претендуете на должность выше начинающего разработчика, вы должны разбираться в следующих темах:

1. Проектирование и ООП

  • 3 базовых понятия ООП
  • модификаторы доступа
  • статические члены класса
  • магические методы, конструктор
  • Абстрактный класс и Интерфейс
  • шаблоны проектирования, Синглтон

2. Клиент-серверное взаимодействие

  • идея DNS
  • протокол HTTP, заголовки, GET/POST
  • логика работы session и cookies

3. Работа с базой данных

  • типы данных
  • отличия индексов
  • нормализация
  • виды движков (engine) таблиц
  • joins
  • views, triggers, procedures, functions, transactions
  • понимание агрегирующих операций

4. Настройка рабочей среды и администрирование

  • настройка вебсервера и виртуальных хостов
  • самые основные команды для работы в среде Linux

5. Базовые принципы HTML/CSS

  • типы элементов
  • позиционирование
  • селекторы и их приоритетность

6. JavaScript

  • элементы и их события
  • работа с объектами
  • jQuery

7. Регулярные выражения

  • пониманием базовых принципов

 

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

Успешной вам подготовки!

Буду рад услышать критику или предложения в комментариях.

P.S.: так же могу порекомендовать вам менее структурированную, но не менее информативную статью на блоге Антона Шевчука.

]]>
https://stepansuvorov.com/blog/2012/07/%d0%be%d1%82%d0%b1%d0%be%d1%80-php-%d0%ba%d0%b0%d0%bd%d0%b4%d0%b8%d0%b4%d0%b0%d1%82%d0%be%d0%b2-%d0%b2-%d0%bd%d0%b0%d1%88%d0%b5%d0%b9-%d0%ba%d0%be%d0%bc%d0%bf%d0%b0%d0%bd%d0%b8%d0%b8/feed/ 7
Совсем немного о многопроцессовости в PHP https://stepansuvorov.com/blog/2012/07/%d1%81%d0%be%d0%b2%d1%81%d0%b5%d0%bc-%d0%bd%d0%b5%d0%bc%d0%bd%d0%be%d0%b3%d0%be-%d0%be-%d0%bc%d0%bd%d0%be%d0%b3%d0%be%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%be%d0%b2%d0%be%d1%81%d1%82%d0%b8/ https://stepansuvorov.com/blog/2012/07/%d1%81%d0%be%d0%b2%d1%81%d0%b5%d0%bc-%d0%bd%d0%b5%d0%bc%d0%bd%d0%be%d0%b3%d0%be-%d0%be-%d0%bc%d0%bd%d0%be%d0%b3%d0%be%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%be%d0%b2%d0%be%d1%81%d1%82%d0%b8/#comments Mon, 02 Jul 2012 12:33:35 +0000 http://stepansuvorov.com/blog/?p=265 Continue reading ]]> Только ключевые моменты:

– магия происходит с помощью функции pcntl_fork.

– работает только в CGI и CLI-режимах

– немного кода

$pid = pcntl_fork();
// создался дочерний процесс, все просто
// но дальше основная магия: выполнение едет в 2 независимых потока
// и все что будет дальше выполнится 2 раза
// резонный вопрос: как нам определить основной потом и дочерний
// а вот так:
if ($pid == -1) {
    //функции не удалось создать поток - ошибка
} elseif ($pid) {
    //если идентификатор есть - это родительский поток
} else {
    //если нет - соответственно дочерний
}
i++; //а этот код будет выполнен обеими потоками

– теперь пример

$pid = pcntl_fork();
if ($pid == -1) {
     die('Error of pcntl_fork');
} elseif ($pid) {
    echo '[first]';
} else {
    echo '[second]';
}
echo '[both]';

Выполним через командную строку:

$ php fork.php
[first][both][second][both]

Вот такой вот порядок.

]]>
https://stepansuvorov.com/blog/2012/07/%d1%81%d0%be%d0%b2%d1%81%d0%b5%d0%bc-%d0%bd%d0%b5%d0%bc%d0%bd%d0%be%d0%b3%d0%be-%d0%be-%d0%bc%d0%bd%d0%be%d0%b3%d0%be%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%be%d0%b2%d0%be%d1%81%d1%82%d0%b8/feed/ 2
Вторая встреча ThinkPHP. https://stepansuvorov.com/blog/2012/06/%d0%b2%d1%82%d0%be%d1%80%d0%b0%d1%8f-%d0%b2%d1%81%d1%82%d1%80%d0%b5%d1%87%d0%b0-thinkphp/ https://stepansuvorov.com/blog/2012/06/%d0%b2%d1%82%d0%be%d1%80%d0%b0%d1%8f-%d0%b2%d1%81%d1%82%d1%80%d0%b5%d1%87%d0%b0-thinkphp/#respond Wed, 27 Jun 2012 16:43:13 +0000 http://stepansuvorov.com/blog/?p=246 Continue reading ]]>

ThinkPHP#2 или подумаем о PHP еще раз. Хотя (просматривая темы докладов), думать-обсуждать в этот раз мы похоже PHP не будем, будем думать о JavaScript, что тоже хорошо.

Итак посмотрим что у нас есть по докладам:

1. Управление кодом в JavaScript. – из описания следует что это очень общая и пафосная тема. Трудно представить что реально там будет.  Ставлю 7 балов из 10 по шкале интересности.

2. Безопасность веб приложений. – Ну тут вообще капец какая общая тема, даже после описания тема не стала уже. Хоть бы пару тезисов. А так судя по всему просто по верхам пройдемся. 4 бала

3. Введение в MVVM на примере Knockout для JavaScript разработчиков. – Вот это пожалуй самая интересная тема, по крайней мере самая четкая: MVVM подход и Knockout. При хорошем изложении материала может быть очень полезно. Ставлю на хорошего докладчика 9 балов.

Линк на регистрацию http://thinkphp.com.ua/think-two.html

 

]]>
https://stepansuvorov.com/blog/2012/06/%d0%b2%d1%82%d0%be%d1%80%d0%b0%d1%8f-%d0%b2%d1%81%d1%82%d1%80%d0%b5%d1%87%d0%b0-thinkphp/feed/ 0
ThinkPHP – сообществу быть? https://stepansuvorov.com/blog/2012/05/thinkphp-%d1%81%d0%be%d0%be%d0%b1%d1%89%d0%b5%d1%81%d1%82%d0%b2%d1%83-%d0%b1%d1%8b%d1%82%d1%8c/ https://stepansuvorov.com/blog/2012/05/thinkphp-%d1%81%d0%be%d0%be%d0%b1%d1%89%d0%b5%d1%81%d1%82%d0%b2%d1%83-%d0%b1%d1%8b%d1%82%d1%8c/#comments Thu, 24 May 2012 06:06:03 +0000 http://stepansuvorov.com/blog/?p=233 Решил опубликовать ссылку на событие: http://thinkphp.com.ua/

это мероприятие – первый кирпичик в основание этого сообщества

Посмотрим что будет.

]]>
https://stepansuvorov.com/blog/2012/05/thinkphp-%d1%81%d0%be%d0%be%d0%b1%d1%89%d0%b5%d1%81%d1%82%d0%b2%d1%83-%d0%b1%d1%8b%d1%82%d1%8c/feed/ 4
Отправка логов php на почту. https://stepansuvorov.com/blog/2012/05/%d0%be%d1%82%d0%bf%d1%80%d0%b0%d0%b2%d0%ba%d0%b0-%d0%bb%d0%be%d0%b3%d0%be%d0%b2-php-%d0%bd%d0%b0-%d0%bf%d0%be%d1%87%d1%82%d1%83/ https://stepansuvorov.com/blog/2012/05/%d0%be%d1%82%d0%bf%d1%80%d0%b0%d0%b2%d0%ba%d0%b0-%d0%bb%d0%be%d0%b3%d0%be%d0%b2-php-%d0%bd%d0%b0-%d0%bf%d0%be%d1%87%d1%82%d1%83/#respond Wed, 16 May 2012 07:12:10 +0000 http://stepansuvorov.com/blog/?p=221 Continue reading ]]> При отладке какого-либо скрипта часто возникает необходимость прослеживать по логам состояние/значение переменных, вхождение в блоки условий и т.д. Есть множество различных способов ведения логов и их дальнейшего разбора. Я бы хотел рассмотреть в этом посте логирование с отправкой информации на почтовый ящик. Это удобно для дебага, когда применить нормальные средства отладки не удается. Итак что нам нужно:

1) Работающая функция mail на стороне сервера.

Если не работает – идем сюда /etc/php5/apache2/php.ini и ищем параметр sendmail_path прописываем в него следующее:

sendmail_path = "/usr/sbin/sendmail -t -i"

Да, можно настроить и свой крутой почтовый сервер, но нам пока этого не нужно.

проверим:

<?php mail('somewhere@somemail.com', 'hi', 'your mail works');

Дальше можно накидать свою функцию, которая будет логировать все что мы ее подадим в качестве параметра, что типа:

function mylog( $data )
{
    $dumpData = "\n";
    $dumpData .=  "<pre>";
    $dumpData .= print_r($data, 1);
    $dumpData .=  "</pre>";
    $dumpData .= "<br/><br/><br/>\n\n\n";
    $dumpData .= print_r(debug_backtrace(), 1);
    mail( MAIL_TO, DEBUG, $dumpData );
}

2) Удобный почтовый клиент, который позволит фильтровать полученные логи.

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

Еще раз повторюсь я за отладку с использованием спец программ для отладки, но порой бывает приходится прибегать и к таким методам.

]]>
https://stepansuvorov.com/blog/2012/05/%d0%be%d1%82%d0%bf%d1%80%d0%b0%d0%b2%d0%ba%d0%b0-%d0%bb%d0%be%d0%b3%d0%be%d0%b2-php-%d0%bd%d0%b0-%d0%bf%d0%be%d1%87%d1%82%d1%83/feed/ 0