4 октября 2008 года прошел очередной конкурс “Программания” от компании (экс Validio) Global Logic. Это был 13 по счету конкурс, проходил он в здании Харьковского театра оперы и балета - народу было очень много. Стоит отметить, что в этом году конкурс проходил не только в Харькове, а еще в Киеве и Львове. Призы были стандартные (много было мониторов), главный приз - MacBook Pro ![]()
В этом году вопросы мне понравились - отвечал на темы PHP, Dynamic HTML, AJAX, XML, Основы SQL, English ну и совсем чуть чуть .NET.
Количество граблей было достаточным. Каждый второй вопрос, естественно, был с подвохом. Поделюсь с вами этими каверзными вопросами.
Dynamic HTML
1. Как будет выглядеть блок? (какой будет вид bordera?)
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”> <html> <head> <style> .red { border:1px solid red; } .blue { border:1px solid blue; } .yellow { border:1px solid yellow; } </style> </head> <body> <div class=“red yellow blue“> Block with border </div> </body> </html>
И как вы думаете?
Ответ: на самом деле блок будет иметь ЖЕЛТУЮ рамку, т.к. CSS класс “yellow” был определен последним в секции style (а порядок задания классов в элементе не имеет значения).
2. Вопрос по поводу приведения типов в javascript:
Каким будет значение переменной a?
var a = 1 + 2 + “3″;
Ответ: 33
Javascript изначально выполнит сложение целых чисел, а потом произведет конкатенацию со строкой.
3. Подвох при работе со строками в javascript (replace)
Каким будет значение переменной s?
var s = “000,777,000,777″; s = s.replace(“000″, “111″);
На первый взгляд, хочется сказать, что результирующая строка будет выглядеть так: “111,777,111,777″.
Но в действительности метод replace предназначен для работы с регулярными выражениями. В данном случае первый параметр - строка “000″ рассматривается как регулярное выражение и результатом будет строка “111,777,000,777″ (перестановка выполнится при первом нахождении подстроки “000″).
Если же вам нужно заменить подстроку в строке javascript, то следует добавить в регулярное выражение модификатор g (global):
var s = “000,777,000,777″; s = s.replace(/000/g, “111″);
Здесь уже выполнится замена всех вхождений подстроки и результатом будет “111,777,111,777″.
4. Добавление комментария в div средствами DOM.
В принципе, ничего сложного. Просто никогда не пользовался - да и вообще не пойму кому такое нужно?
Например, есть div:
<div id=“block”> Нуждаюсь в комментарии </div>
Добавление комментария:
document.getElementById(“block”).appendChild(document.createComment(“русский коммент”));
ИМХО, этот вопрос был включен с мыслью о том, что никто не использует это на практике. document.createComment встречается гораздо реже чем document.createElement
По PHP граблей было куда меньше, так что эти вопросы рассматривать не буду. Пожалуй, единственное, что было новым для меня - один момент относительно обработки исключительных ситуаций. Информацию эту узнал в тот же день, когда пошел на очередную пару по JAVA (я теперь каждую субботу еще и на JAVA хожу :).
Момент заключается в следующем: если у нас есть наследники класса Exception (например, MyException) и если в блоке try возможен выброс исключений родительского класса и класса наследника, то отлавливать их нужно в порядке от наследника до родителя. Следующий пример показывает корректный вариант следования блоков catch:
<?php class MyException extends Exception { public function __construct($msg, $code) { parent::__construct($msg, $code); } } try { throw new MyException(‘Some message’); } catch (MyException $e) { echo “MyException”; } catch (Exception $e) { echo “Exception (base)”; } ?>
Данный пример выводит строку “MyException” - попытка обработать исключение типа MyException удалась.
Но если поменять порядок блоков catch:
<?php try { throw new MyException(‘Some message’); } catch (Exception $e) { echo “Exception (base)”; } catch (MyException $e) { echo “MyException”; } ?>
В этом случае сработает первый блок catch и результатом будет строка “Exception (base)”
Вот еще вспомнил вопрос, подвох в котором был касательно ссылок в PHP.
<?php $a = 1; $b = &$a; unset($a); echo $b; ?>
Значение переменной $b будет равно 1. Ссылка дает возможность переменным указывать на одно и то же содержание. Это не значит, что $b указывает на $a, поэтому значение $b по прежнему 1.
Пожалуй это все что хотел написать по данной теме.
