Форумы портала PHP.SU » Разное » Прочее » PHP Test by PHP.SU

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

1. EuGen - 19 Марта, 2012 - 11:27:52 - перейти к сообщению
Увидел здесь некоторые вопросы, на которые и сам в свое время на форуме давал ответы. Можно продолжить. Своей страницы у меня нет, но все же напишу здесь.
Важно - попробуйте ответить, не используя сэндбоксы и не проверяя результат скриптом - так результат теста будет гораздо актуальнее.
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. Какой результат вернет
PHP:
скопировать код в буфер обмена
  1. $sTest = 'test';

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


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. Что будет результатом:
PHP:
скопировать код в буфер обмена
  1. $a=2;
  2. var_dump($a=$a++);

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

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-особенностей, т.к. версия СУБД заранее неизвестна) - не допускается. Пример:
CODE (text):
скопировать код в буфер обмена
  1. foo|2
  2. bar|3
  3. baz|1

Результат должен быть:
CODE (text):
скопировать код в буфер обмена
  1. foo
  2. foo
  3. bar
  4. bar
  5. bar
  6. baz

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

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. Что будет результатом:
PHP:
скопировать код в буфер обмена
  1. $fTest=-1.5;
  2. var_dump(gettype(sqrt($fTest)));

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

21. Есть ли разница между:
PHP:
скопировать код в буфер обмена
  1. $sData="string";
  2. unset($sData);

и
PHP:
скопировать код в буфер обмена
  1. $sData="string";
  2. $sData=null;

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

22. Что будет результатом:
PHP:
скопировать код в буфер обмена
  1. $bar = <<<EOT
  2. some
  3. text
  4. here
  5. EOT ;

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

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. Что будет результатом:
PHP:
скопировать код в буфер обмена
  1. $foo=array(sqrt(-1)=>'bar');
  2. var_dump($foo);

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

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 (по моей субъективной оценке).
2. Мелкий - 19 Марта, 2012 - 12:00:53 - перейти к сообщению
Интересно, давай ещё Закатив глазки

Спойлер (Отобразить)
3. Champion - 19 Марта, 2012 - 15:17:13 - перейти к сообщению
EuGen, вот мой вариант)
Спойлер (Отобразить)

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

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


что надо написать на место ..., чтобы в выводе вар-дампа значение $r поменялось на 64? Оператор new new использовать больше нельзя.
4. EuGen - 19 Марта, 2012 - 15:47:45 - перейти к сообщению
Выделил в новую тему
Champion
В задаче номер 9 я сделал уточнение - нельзя использовать СУБД-зависимые особенности (вроде оператора присваивания)
(Добавление)
Добавил те ответы, которые нашел.
5. OrmaJever - 19 Марта, 2012 - 17:32:01 - перейти к сообщению
Да... многие вопрсоы заставляют задуматся.
6. EuGen - 20 Марта, 2012 - 09:17:00 - перейти к сообщению
Дополнил ответы.
Предлагаю наиболее сложные и интересные вопросы писать в эту тему. Я позже дополню тест. Очень желательно, чтобы это было ситуацией "из жизни", так как разбирать абстрактные, созданные специально для теста, ситуации - не столь интересно.
7. Мелкий - 20 Марта, 2012 - 09:27:20 - перейти к сообщению
Пробую ответить дальше на вопросы: (спойлеры не читал, правда-правда)
Спойлер (Отобразить)

(Добавление)
По спойлерам к ответам замечания:
Спойлер (Отобразить)
8. EuGen - 20 Марта, 2012 - 10:00:11 - перейти к сообщению
Мелкий
Насчет инкремента - дополнил. Мой комментарий не раскрывает до конца сути происходящего, потому заменил пояснение на Ваше.
Про интерфейсы и константы - опечатка в слове "даже", исправлено
isset - вопрос. Вероятно, вопрос версий? Я поэкспериментирую. Если дело в версии, то уберу из пояснения (т.к. вносит неоднозначность).
Про HEREDOC - в том и смысл. В реально возникшей ситуации достаточно долго пришлось разбирать, где же ошибка.
9. Мелкий - 20 Марта, 2012 - 10:06:10 - перейти к сообщению
EuGen пишет:
isset - вопрос. Вероятно, вопрос версий? Я поэкспериментирую. Если дело в версии, то уберу из пояснения (т.к. вносит неоднозначность).

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


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

Ну это вопрос к IDE, почему неверно подсвечивает синтаксис.
10. EuGen - 20 Марта, 2012 - 10:21:14 - перейти к сообщению
Мелкий
Про isset - верно, даже на 5.3 я увидел одно и то же. Поправил комментарий, внеся пример с реальным отличием.
Насчет IDE - они бывают разные, суть от этого неизменна.
11. Champion - 20 Марта, 2012 - 11:44:40 - перейти к сообщению
Мелкий пишет:
Это подло! Я на лету поправил ошибку и проигнорировал пробел.
А у меня рефлекс - при виде хередока внимательно смотреть, не стоит ли вокруг него чего-то лишнее)
12. Мелкий - 20 Марта, 2012 - 13:12:13 - перейти к сообщению
Champion пишет:
что надо написать на место ..., чтобы в выводе вар-дампа значение $r поменялось на 64? Оператор new new использовать больше нельзя.

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

Так что осторожно, приватные члены больше не приватны и к ним можно получить доступ без модификации класса.
13. EuGen - 20 Марта, 2012 - 13:17:51 - перейти к сообщению
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. //

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

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


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

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

 

Powered by ExBB FM 1.0 RC1