2 сентября 2010 г.

Немного про конкатенацию строк, print и echo в PHP

PHP как язык имеет много интересных особенностей. Одна из таких, это конкатенация строк, а также то как работают две самый популярные функции. Чтобы не расплываться по древу попробую описать в одном примере:
PHP
1
2
3
<?php
echo print (7)+1,'5'+'4';
?>
Какой будет результат?

Давайте для начала опишу некотороые свойства и особенности:
  • Только print возвращает результат, и это всегда 1
  • Только echo позволяет конкатенировать строки запятой
  • Обе print и echo могут работать без скобок
На последнем в свое время я как раз и попался.

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

PHP
1
2
3
4
56
7
8
9
1011
12
13
14
1516
17
18
<?php
echo print (7)+'1','5'+'4';
 
// print не ограничевается скобками но не позовляет запятую:
echo print 7 + '1','5'+'4'; 
// Знак "+" кастит оба операнда в числа и имеет более 
// высокий приоритет
echo print (7+1),(5+4);
echo print 8,9;
 //print работает как функция и после выполнения (вывода строки)
// возваращет результат 1
print 8; echo 1,9;
 
// echo позволяет знак "," для конкатенации строк, он кастит оба 
// операнда в строки
print "8"; echo "19"; // => 819 
// Готово
?>

Вот такие простые вроде бы вещи, а столько ньюансов...

Еще об этом: на altervista

18 августа 2010 г.

Каменный век пора бы оставить

Еще когда я только изучал программирование и игрался с Borland Pascal 7.0 я научился пользоваться встроенным дебаггером. Гениальная фича, позволяющая увидеть значение любой переменной во время выполнения, остановить выполнение программы в любой удобной точке и многое другое.
Но суть не в паскале. Суть в том что PHP это все тоже есть, а народ с завидной упертостью тратит часы на var_dump() и print_r();die(); вместо того что бы потратить пять минут на настройку xdebug и любимого ide (netbeans или PDT|Zend Studio) и наслаждаться процессом дебагинга.
Особенно удивляют люди который "вардампят" внутри Zend Studio. За что платили, то? Аналогично и с Zend Framework, вед Zend_Debug + Zend_Log просто не оставляют шансов var_dump.

В чем причина?

Я думаю в том-самом "легком старте" PHP. Люди научившись находить проблемы одним способом считают что лучше быть не может и останавливаются на этом. Еще народ не хочет учится, хотя для программиста этот процесс должен быть перманентным. Мало внимания уделяют этому и книги, в тоже время вовсю прославляя var_dump.

Что делать?

Лично я решил в ближайшее время написать мини-статью о "правильном" environment разработчика и основе дебагинга, а также в следующих своих записях использовать debug скрины (правда не знаю как, скорее в виде скриншотов) кода вместо простого var_dump и отображения результатов.

16 августа 2010 г.

Получил сертификат PHP5 Zend Certified Engineer

Недели подготовки позади, сомнения и страхи тоже. Очередная поставленная цель достигнута и наконец строчка в Zend Yellow Pages с моим профилем украшает их сайт :)
Вот и решил немного рассказать о тестинге, стараясь не особо повторять то, что уже написано сотни раз.

Подготовка

Zend предлагает помимо самого теста, так называемый Examination Bundle, в который помимо ваучера на экзамен, входит 10 mock exams и книжка по подготовке.
Книжки явно недостаточно, она скорее дает некоторое представление о языке, тем не менее надо повторить все темы самому с помощью справочника на оф сайте php, отдельно повторить RegExp, и разобраться во всех OOD паттернах (Singleton, Adapter, Strategy, Factory и т.д.)
Насчет mock exam - вещь очень хорошая и приятная. Эти тесты помогут очень хорошо представить себе интефрейс ПО используемое в Pearson VUE (программа для сдачи тестов). Но 10 тестов ИМХО перебор, хватило бы 5. Так как вопросы в mock exam не пересекаются с реальными, то просто "натаскиваться" на вопросы не стоит, как и искать правды в интернете. Лучше при сомнении в правильности ответа повторить тематику вопроса еще раз.
Обязательно проверяйте весь предлагаемый код в работе. Даже если ответ для вас очевиден. Код может быть обманчив :). Например вам может показаться что код проверяет ваши знания на передачу по ссылке, а на самом деле код может проверять вашу внимательность на наличие return внутри метода. Ведь mock exam именно для этого и сделан. В конце mock exam вы увидите в какой категории ваши знания отличны, а в какой стоит подтянуться (fail, pass, excellent). С пятого mock я выбивал все Excellent, но тест все равно был очень сложен. Стоит заметить, что времени 90 минут это достаточно много (я прошел екзамен и успел еще два раза полностью перепроверить свои ответы).
После подготовки, на сайте Pearson VUE, можно назначить дату и место сдачи теста. Я сдавал в BMS Consulting, хотя разницы никакой нет. Pearson предъявляет одинаковые требования ко всем тестинг-центрам, поэтому как обстановка так и процесс тестирования будет везде примерно одинаков. Главное прийти вовремя и не забыть паспорт.

Ощущения

Когда увидел желанную "Congratulations... " грома и молнии не было. Скорее ощущение удовлетворения от проделанного труда. А так эмоции были разные. Первое было несколько неоднозначным. И заключалось примерно в следующем: "Представляю как ржал парень (про себя естественно) с сертификатом, когда мы его собеседовали на PHP". Тест требует очень глубоких знаний, и терзать глупыми вопросами тех кто его сдал, не лучшая идея. Во время теста очень сложно было отличить опечатку в ответе от неправильного ответа. Казалось что авторы теста просто забыли поставить пробел. В общем хорошо что они не умеют читать мысли сдающих тест :). А так все нормально. Если прележно готовился - сдашь.

Выводы

На вопрос "стоит или нет" сдавать тест - ответ однозначно стоит.
После сдачи теста многое изменяется.
Во-первых, сразу выделяешься из серой массы PHP программеров и тех кто считает, что сертификация бесполезна.
Из-за низкого входного порога PHP кодеров развелось довольно много, но их уровень оставляет желать лучшего. Да и при прохождении собеседований приходится все время отвечать на примитивные вопросы. Сертификация призвана отсеять как первую, так и вторую проблему.
Во-вторых, более четко понимаешь то как работает PHP, его идеологию, на что он ориентирован и как лучше использовать его возможности.
В-третьих, практически не остается "белых пятин" в знаниях. 9 из 10 PHP специалистов (не сдававших тест), тонут при затрагивании темы потоков, а сдавшиее тест - плавают в них, как рыба в воде. А потоки, между прочим одна из сильнейших фич в PHP. Процесс подготовки очень сильно структурирован и покрывает практически все возможности и основные модули PHP. Да и вообще, самым полезным в сертификации является подготовка к тесту.
Недостатки в основном общие для всех тестов, который сводится к тому, что тест не заменяет реальный опыт. Поэтому начинающим программистам оптимальным будет набраться опыта 3+ года, а потом сдавать тест.

2 августа 2010 г.

English version

http://websmithen.blogspot.com/ - английская версия этого блога. Фактически этот сайт оригинал, а на английском сайте будут находится только переводы самых интересных на мой взгляд статей.

Думаете вы все знаете про Public vs. Private ?

Давно заметил, что обычно вопросы про модификаторы доступа в ООП заканчиваются на перечислении public, private, protected и что куда наследуется. Но как показывает практика, большинство людей (включая PHP и C++ ) не задумывается как эти модифиакторы влияют на объекты, считая что оно полностью идентично классам. Но это не так.

Ответе на вопрос: Имеем класс A, у класса есть private свойство $pr. Есть метод, который принимает два значения: int и другого экземпляра класса A. Этот метод изменяет свойство pr переданного экземпляра. Допустит ли это компилятор/транслятор?

Давайте попробуем:
PHP
1
2
3
4
56
7
8
9
1011
12
13
14
1516
17
<?php
class A {
    private $pr = "test";
    public function change($val, A $a) {
        $a->pr = $val;    }
    public function __toString() {
        return (string)$this->pr;
    }
} 
$objOne = new A();
$objTwo = new A();
 
$objOne->change("passed", $objTwo);echo $objTwo;
?>

Каков будет результат выполнения кода? Реакция большинства людей весьма предсказуема: fatal error. Объяснением служит то что мы пытаемся изменить private свойство другого объекта. На самом деле. Необходимо помнить что: модифиакторы доступа (в том числе private) ограничивает доступ по отношению к другим классам, но не объектам. Код выполнится, и пользователь увидит "passed". Поскольку объект работает с одним и тем-же классом. Это основы ООП, поэтому такое поведение должно быть идентично в PHP, C++ и других языках.

27 апреля 2010 г.

Мои любимые игры

На днях увидел на одном сайте список лучших игр всех времен и народов. Решил составить личный список любимых игр.


Кто бы подумал... Всегда считал себя любителем RPG. А по факту стратегии наше все. Прямо хочется перефразировать известную пословицу "Скажи мне во что ты играешь, и я скажу тебе кто ты".


Вот собственно сам список.

  • RPG:
    • Fallout 1 and 2
  • Strategies:
    • Civilization 2, 3
    • Command & Conquer 1, 2 (Tiberium Sun)
    • Red Alert 1, 2 and 3
    • Heroes of Might and Magic 2 and 3
    • Settlers 2 (10 anniversary)
    • Warcraft 1, 2 and 3
    • Battle for Wesnoth
    • Starcraft + Broodwar
    • Warhammer 40k 1
  • Action:
    • Stalker 1 (Shadow of Chernobyl), 2 (Clear Sky) and 3 (Call of Pripyat)
    • GTA 1, 2 and 3
    • Doom 1, 2, 3
    • Quake 1 and 2
    • Half-Life 1 and 2
  • Не играл, но хотел бы
    • Command & Conquer 3
    • Dwarf Fortress
    • Civilization 4
    • UFO Alien Invasion
    • Baldurs Gate 1 and 2
    • Heroes 5
    • Mafia
    • Warhammer 40k 2

Поиск