PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: Сборник задач, в разное время возникавших на моих проектах и на форуме
EuGen Администратор
Отправлено: 19 Марта, 2012 - 11:27:52
Post Id


Профессионал


Покинул форум
Сообщений всего: 9098
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Выделено в отдельную тему из темы "Тест знаний по php"
Увидел здесь некоторые вопросы, на которые и сам в свое время на форуме давал ответы. Можно продолжить. Своей страницы у меня нет, но все же напишу здесь.
Важно - попробуйте ответить, не используя сэндбоксы и не проверяя результат скриптом - так результат теста будет гораздо актуальнее.
0. Что будет результатом:
PHP:
скопировать код в буфер обмена
  1. class Template extends Closure
  2. {
  3. }
  4.  
  5. $rTest = new Template();

и почему?
Спойлер (Отобразить)


1. Напишите функцию get_var_name, которая определяла бы название переменной. То есть:
PHP:
скопировать код в буфер обмена
  1. $some_name='test';
  2. var_dump(get_var_name($some_name));

должна вернуть string(9) "some_name"
Спойлер (Отобразить)

2. Какой результат вернет

и почему?
Спойлер (Отобразить)


3. Какой будет результат исполнения
PHP:
скопировать код в буфер обмена
  1. class Foo
  2. {
  3. }
  4.  
  5. class Bar extends Foo
  6. {
  7. }
  8.  
  9. $rTest = new Bar();
  10. var_dump(($rTest instanceof Foo));
  11.  

и почему?
Спойлер (Отобразить)

4. Что будет результатом:

и почему?
Спойлер (Отобразить)

5. Что будет результатом:
PHP:
скопировать код в буфер обмена
  1. class Foo
  2. {
  3. }
  4.  
  5. class Bar extends Foo
  6. {
  7.    function __construct($sItem, $sValue)
  8.    {
  9.       parent::$sItem=$sValue;
  10.    }
  11. }
  12.  
  13. $rTest=new Bar('foo', 'bar');
  14. var_dump($rTest);

и почему?
Спойлер (Отобразить)

6. Что будет результатом исполнения
PHP:
скопировать код в буфер обмена
  1. interface Foo
  2. {
  3. }
  4.  
  5. interface Bar
  6. {
  7. }
  8.  
  9. class Baz implements Foo, Bar
  10. {
  11. }
  12.  
  13. $rTest = new Baz();

и почему?
Спойлер (Отобразить)

7. Что будет результатом
PHP:
скопировать код в буфер обмена
  1. interface Foo
  2. {
  3.    const Baz = 'test';
  4. }
  5.  
  6. class Bar implements Foo
  7. {
  8.    const Baz = 'another test';
  9. }
  10.  
  11. $rTest = new Bar();
  12. var_dump($rTest::Baz);

и почему?
Спойлер (Отобразить)

8. Что будет результатом
PHP:
скопировать код в буфер обмена
  1. class Foo
  2. {
  3.    function __destruct()
  4.    {
  5.       echo('Destructed');
  6.    }
  7. }
  8.  
  9. $rTest=new Foo();
  10. exit();

и почему?
Спойлер (Отобразить)

9. Дана таблица в SQL, имеющая 2 колонки - value (VARCHAR) и repeat_count (INT). Напишите запрос, результатом которого будет такое множество строк, чтобы каждое значение value повторилось в нём ровно repeat_count раз. Использование хранимых процедур не допускается. Использование СУБД-зависимых особенностей (вроде оператора присваивания для MySQL или PARTITION-особенностей, т.к. версия СУБД заранее неизвестна) - не допускается. Пример:

Результат должен быть:

Спойлер (Отобразить)

10. Что произойдет:
PHP:
скопировать код в буфер обмена
  1. class Foo
  2. {
  3.    static $this = 'test';
  4. }
  5.  
  6. $rTest=new Foo();
  7. var_dump(Foo::$this);
  8.  

и почему?
Спойлер (Отобразить)

11. В чем отличие и есть ли оно в использовании use и global в замыканиях?
Спойлер (Отобразить)

12. Все ли типы данных допустимы для type-hinting? Если не все, то какие запрещены?
Спойлер (Отобразить)

13. В чем разница между require и include ?
Спойлер (Отобразить)

14. Общеизвестно, что имена функций в PHP - регистронезависимы. Какая директива php.ini включает регистрозависимость функций?
Спойлер (Отобразить)

15. Дана архитектура - есть 2 сервера A и B, на которых размещен некоторый проект. На обоих размещено одно и то же PHP-приложение. Есть некоторый балансер C. Когда пользователь запрашивает страницу на веб-сайте, запрос приходит к C и затем он, рандомно выбирая 0 или 1 - отправляет запрос, соответственно, на A или B. Серверы A и B используют одну и ту же БД, располагающуюся на сервере D. Все работало хорошо, но потребовалось сделать часть для авторизованных пользователей. Разработчики предоставили такой функционал, но возникла проблема: пользователь при авторизации стартовал сессию на одном из серверов A или B (в зависимости от того, куда был послан запрос сервером C) - и при повторном действии уже в личном кабинете, запрос мог уйти на тот сервер, на котором сессия пользователя не была запущена. Соответственно, происходил выход из личного кабинета. Как можно решить эту проблему. Оценивается: быстродействие, минимальность вмешательства в код приложения, минимальная сложность решения как с точки зрения сетевой инфраструктуры, так и с точки зрения общего устройства.
Спойлер (Отобразить)

16. Допустимы ли имена свойств, состоящие только из цифр? Если да - то в каком случае? Если нет - то почему?
Спойлер (Отобразить)

17. Дана таблица. Её поля id (INT) и value (VARCHAR). Напишите запрос, который удвоит id тех строк этой таблицы, у которых name принадлежит заданному списку значений A0, A1... An. (предполагается, что нет никаких CONSTRAINT ни на одном из полей таблицы, так что уникальность результирующих id не требуется)

18. Имеется php-скрипт, который предполагается к исполнению как системный сервис ("демон"). Возможна ли передача параметров уже работающему скрипту? Если нет, то почему? Если да, то как можно модифицировать скрипт так, чтобы он принимал параметры, будучи уже запущенным?
Спойлер (Отобразить)

19. В чем отличие использования PHP как модуля от использования его в режиме CGI? А для FastCGI? Если есть разница, опишите. Напишите преимущества и недостатки всех трех способов организации.
Спойлер (Отобразить)

20. Что будет результатом:

и почему?
Спойлер (Отобразить)

21. Есть ли разница между:

и

- то есть между unset и установкой значения null ? Если нет, то почему? Если да, то в чем разница?
Спойлер (Отобразить)

22. Что будет результатом:

и почему?
Спойлер (Отобразить)

23. Существует ли ограничение на число триггеров одного события и времени на таблице? То есть, к примеру, сколько триггеров может быть BEFORE INSERT? Уточнение: СУБД - MySQL
Спойлер (Отобразить)

24. Исполняются ли триггеры при неявном наступлении события, на которое они созданы? (Так, например, если есть триггер BEFORE INSERT - сработает ли он при LOAD DATA?) Уточнение: СУБД - MySQL
Спойлер (Отобразить)

25. Что произойдет:
PHP:
скопировать код в буфер обмена
  1. define('__TEST__', rand(0,1), true);
  2. $foo=__TEST__;
  3. $bar=!$foo;
  4. while($foo!=$bar)
  5. {
  6.    $foo=__TEST__;
  7. }

и почему?
Спойлер (Отобразить)

26. В чем разница между явной и неявной рекурсией? Приведите пример того и другого в PHP.
Спойлер (Отобразить)

27. Что будет результатом:

и почему?
Спойлер (Отобразить)

28. Данные всех ли типов можно сериализовать? Если нет, то данные каких типов нельзя сериализовать?
Спойлер (Отобразить)

29. Что произойдет:
PHP:
скопировать код в буфер обмена
  1. class Foo
  2. {
  3.    function  __destruct()
  4.    {
  5.        return new Foo();
  6.    }
  7. }
  8.  
  9. $rTest=new Foo();

и почему?
Спойлер (Отобразить)

30. Предположим, что HOST, USER, PASSWORD - данные для правильного MySQL - соединения; DB, TABLE, FIELD - указывают на существующую БД,таблицу и поле. Что произойдет:
PHP:
скопировать код в буфер обмена
  1. $rLink=mysql_connect(HOST, USER, PASSWORD) || exit('Connection error');
  2. $rSelect=mysql_query('SELECT `'.FIELD.'` FROM `'.TABLE.'`');
  3. while($rgRow=mysql_fetch_row($rSelect))
  4. {
  5.    echo($rgRow[0].PHP_EOL);
  6. };
  7. mysql_close($rLink);

и почему?
Спойлер (Отобразить)

31. Что произойдет?
PHP:
скопировать код в буфер обмена
  1. class Xception extends Exception
  2. {
  3. }
  4.  
  5.  
  6. try
  7. {
  8.    throw new Xception('test here');
  9. }
  10. catch(Exception $e)
  11. {
  12.    throw new Xception('another test here');
  13. }

и почему?
Спойлер (Отобразить)

32. Каков будет результат исполнения кода:
PHP:
скопировать код в буфер обмена
  1. class Foo
  2. {
  3.    public function __get($sName)
  4.    {
  5.       return $sName;
  6.    }
  7. }
  8. $rObj = new Foo;
  9. var_dump(empty($rObj->el));

и почему?
Спойлер (Отобразить)

За каждый вопрос дается от 0 до 2 баллов (в зависимости от степени полноты и корректности ответа).
Среди вопросов встречаются вопросы-шутки. Вам решать, отвечать на них (к тому же я не говорю, какие именно вопросы), или нет, но они включены, так как возникали в действительности (просто ответ на них можно рассматривать как юмористический).
Если вы набрали более 90%, то вы очень хорошо знаете веб-программирование на PHP (по моей субъективной оценке).


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Мелкий Супермодератор
Отправлено: 19 Марта, 2012 - 12:00:53
Post Id



Активный участник


Покинул форум
Сообщений всего: 11463
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 554 раз(а)




Выделено в отдельную тему из темы "Тест знаний по php"
Интересно, давай ещё Закатив глазки

Спойлер (Отобразить)


Отредактировано администратором: EuGen, 19 Марта, 2012 - 12:39:34
Прокомментирую то, что Вы ответили:
Спойлер (Отобразить)

Текущий балл: 13


-----
Если вы не знаете, почему это работает, вероятно, оно и не работает на самом деле. (С.Макконнелл)...
 
 Top
Champion Супермодератор
Отправлено: 19 Марта, 2012 - 15:17:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 4353
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Выделено в отдельную тему из темы "Тест знаний по php"
EuGen, вот мой вариант)
Спойлер (Отобразить)

(Добавление)
Спойлер (Отобразить)

(Добавление)
Некоторые вопросы нагнали меня на новый вопрос.
PHP:
скопировать код в буфер обмена
  1. class A {
  2. private $r = 8;
  3. }
  4. $Q = new A;
  5. ...


что надо написать на место ..., чтобы в выводе вар-дампа значение $r поменялось на 64? Оператор new new использовать больше нельзя.


Отредактировано администратором: EuGen, 19 Марта, 2012 - 16:00:45
Отпишу комментарий
Спойлер (Отобразить)

Текущий балл: 19
 
 Top
EuGen Администратор
Отправлено: 19 Марта, 2012 - 15:47:45
Post Id


Профессионал


Покинул форум
Сообщений всего: 9098
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Выделил в новую тему
Champion
В задаче номер 9 я сделал уточнение - нельзя использовать СУБД-зависимые особенности (вроде оператора присваивания)
(Добавление)
Добавил те ответы, которые нашел.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
OrmaJever
Отправлено: 19 Марта, 2012 - 17:32:01
Post Id



Активный участник


Покинул форум
Сообщений всего: 7524
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 298 раз(а)




Да... многие вопрсоы заставляют задуматся.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
EuGen Администратор
Отправлено: 20 Марта, 2012 - 09:17:00
Post Id


Профессионал


Покинул форум
Сообщений всего: 9098
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Дополнил ответы.
Предлагаю наиболее сложные и интересные вопросы писать в эту тему. Я позже дополню тест. Очень желательно, чтобы это было ситуацией "из жизни", так как разбирать абстрактные, созданные специально для теста, ситуации - не столь интересно.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Мелкий Супермодератор
Отправлено: 20 Марта, 2012 - 09:27:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 11463
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 554 раз(а)




Пробую ответить дальше на вопросы: (спойлеры не читал, правда-правда)
Спойлер (Отобразить)

(Добавление)
По спойлерам к ответам замечания:
Спойлер (Отобразить)


Отредактировано администратором: EuGen, 20 Марта, 2012 - 09:40:47
Как и раньше, отпишу комментарии (с этого момента для удобства подсчета буду писать и о корректных ответах)
Спойлер (Отобразить)

За эту часть 12 баллов (и еще 13 было), потому
Текущий балл: 25


-----
Если вы не знаете, почему это работает, вероятно, оно и не работает на самом деле. (С.Макконнелл)...
 
 Top
EuGen Администратор
Отправлено: 20 Марта, 2012 - 10:00:11
Post Id


Профессионал


Покинул форум
Сообщений всего: 9098
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Мелкий
Насчет инкремента - дополнил. Мой комментарий не раскрывает до конца сути происходящего, потому заменил пояснение на Ваше.
Про интерфейсы и константы - опечатка в слове "даже", исправлено
isset - вопрос. Вероятно, вопрос версий? Я поэкспериментирую. Если дело в версии, то уберу из пояснения (т.к. вносит неоднозначность).
Про HEREDOC - в том и смысл. В реально возникшей ситуации достаточно долго пришлось разбирать, где же ошибка.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Мелкий Супермодератор
Отправлено: 20 Марта, 2012 - 10:06:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 11463
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 554 раз(а)




EuGen пишет:
isset - вопрос. Вероятно, вопрос версий? Я поэкспериментирую. Если дело в версии, то уберу из пояснения (т.к. вносит неоднозначность).

Строго по ману и поведение такое уже давно:
http://nl.php.net/manual/en/function.isset.php
Цитата:
Determine if a variable is set and is not NULL.


EuGen пишет:
В реально возникшей ситуации достаточно долго пришлось разбирать, где же ошибка.

Ну это вопрос к IDE, почему неверно подсвечивает синтаксис.


-----
Если вы не знаете, почему это работает, вероятно, оно и не работает на самом деле. (С.Макконнелл)...
 
 Top
EuGen Администратор
Отправлено: 20 Марта, 2012 - 10:21:14
Post Id


Профессионал


Покинул форум
Сообщений всего: 9098
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Мелкий
Про isset - верно, даже на 5.3 я увидел одно и то же. Поправил комментарий, внеся пример с реальным отличием.
Насчет IDE - они бывают разные, суть от этого неизменна.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Champion Супермодератор
Отправлено: 20 Марта, 2012 - 11:44:40
Post Id



Активный участник


Покинул форум
Сообщений всего: 4353
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Мелкий пишет:
Это подло! Я на лету поправил ошибку и проигнорировал пробел.
А у меня рефлекс - при виде хередока внимательно смотреть, не стоит ли вокруг него чего-то лишнее)
 
 Top
Мелкий Супермодератор
Отправлено: 20 Марта, 2012 - 13:12:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 11463
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 554 раз(а)




Champion пишет:
что надо написать на место ..., чтобы в выводе вар-дампа значение $r поменялось на 64? Оператор new new использовать больше нельзя.

Озадачился этим вопросом, решение есть, но только для PHP5.4.
PHP:
скопировать код в буфер обмена
  1. $f = function($param) {$this->r = $param;};
  2. $f = $f->bindTo($Q, $Q);
  3. $f(64);

Так что осторожно, приватные члены больше не приватны и к ним можно получить доступ без модификации класса.


-----
Если вы не знаете, почему это работает, вероятно, оно и не работает на самом деле. (С.Макконнелл)...
 
 Top
EuGen Администратор
Отправлено: 20 Марта, 2012 - 13:17:51
Post Id


Профессионал


Покинул форум
Сообщений всего: 9098
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




PHP:
скопировать код в буфер обмена
  1. class A
  2. {
  3.     private $r = 8;
  4. }
  5. $Q = new A;
  6. //
  7. classkit_method_add('A', '_set_r', '$mValue', '$this->r=$mValue;');
  8. $Q->_set_r(64);
  9. //

?


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Champion Супермодератор
Отправлено: 20 Марта, 2012 - 14:03:45
Post Id



Активный участник


Покинул форум
Сообщений всего: 4353
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Мелкий, EuGen, решения интересные, я даже не знал таких возможностей. Впрочем, я много чего не знаю)
Но Мелкий, как сам сказал, только 5.4, а classkit_method_add не включен в стандартную поставку PHP как я понял.
Я предполагал решение с serialize + preg_replace + unserialize. Где это применимо - не знаю. Просто в голову пришло)
 
 Top
Мелкий Супермодератор
Отправлено: 20 Марта, 2012 - 14:39:55
Post Id



Активный участник


Покинул форум
Сообщений всего: 11463
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 554 раз(а)




Champion пишет:
Я предполагал решение с serialize + preg_replace + unserialize.

Однако, идея.


И интересность нашёл для сериализации - используется null-байт для кодирования членов класса.
Цитата:
O:1:"A":1:{s:4:"Ar";i:8;}

Вот здесь в наличии пара NULL'ов. Перепроверил по мануалу - так и должно быть.


-----
Если вы не знаете, почему это работает, вероятно, оно и не работает на самом деле. (С.Макконнелл)...
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Прочее »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB