Вопросы каждый хороший PHP-разработчик должен иметь возможность ответить

Я проходил через Вопросы каждый хороший .Net разработчик должен был быть в состоянии ответить и был очень впечатлен содержанием и подходом к этому вопросу, и поэтому в том же духе я задаю этот вопрос для PHP Developer.

На какие вопросы , на ваш взгляд, должен ответить хороший программист PHP?

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

Надеемся на некоторые удивительные ответы.

ПРИМЕЧАНИЕ . Пожалуйста, ответьте на вопросы также, как это предлагается в комментариях, чтобы люди могли узнать что-то новое в отношении языка.

Solutions Collecting From Web of "Вопросы каждый хороший PHP-разработчик должен иметь возможность ответить"

По общему признанию, я украл этот вопрос откуда-то еще (не могу вспомнить, где я его читал), но подумал, что это смешно:

Q: Что такое T_PAAMAYIM_NEKUDOTAYIM ?
A: Оператор разрешения области (двойной двоеточие)

Опытный PHP'er сразу знает, что это значит. Менее опытные (а не иврите) разработчики могут захотеть прочитать это .

Но сейчас более серьезные вопросы:


В: В чем причина этого предупреждения: «Предупреждение: не удается изменить информацию заголовка – уже отправленные заголовки», и что является хорошей практикой для предотвращения этого?
A: Причина: данные тела отправлены, что также приводит к отправке заголовков.
Предупреждение. Прежде чем выводить данные тела, обязательно выполните код заголовка. Убедитесь, что вы случайно не отправили пробелы или любые другие символы.


В: Что не так в этом запросе: "SELECT * FROM table WHERE id = $_POST[ 'id' ]" ?
A: 1. Это является вульгарной для SQL-инъекции. Никогда не используйте пользовательский ввод непосредственно в запросах. Сначала санируйте его. Предпочтительно использовать подготовленные операторы ( PDO ). 2. Не выбирать все столбцы (*), а указывать каждый отдельный столбец. Это в основном предотвращает запросы, вызывающие память, когда, например, в какой-то момент в будущем добавляется столбец BLOB.


В: Что не так с этим утверждением if: if( !strpos( $haystack, $needle ) ... ?
A: strpos возвращает позицию индекса, где вначале найдена игла $, которая может быть 0 . Поскольку 0 также разрешает false решение должно использовать строгое сравнение: if( false !== strpos( $haystack, $needle )...


В: Каков предпочтительный способ написать этот оператор if и почему?
if( 5 == $someVar ) или if( $someVar == 5 )
A: Первый, поскольку он предотвращает случайное присвоение от 5 до $ someVar, когда вы забудете использовать 2 equalsigns ( $someVar = 5 ) и вызовет ошибку, последнее не будет.


Q: Учитывая этот код:

 function doSomething( &$arg ) { $return = $arg; $arg += 1; return $return; } $a = 3; $b = doSomething( $a ); 

… каково значение $a и $b после вызова функции и почему?
A: $a4 а $b3 . Первый, поскольку $ arg передается по ссылке, последний, потому что возвращаемое значение функции является копией (а не ссылкой) начального значения аргумента.


Особая ООП

В: Какая разница между public , protected и private в определении класса?
A: public делает члена класса доступным для «всех», protected делает член класса доступным только для себя и производных классов, private делает член класса доступным только для самого класса.


В: Что не так с этим кодом:

 class SomeClass { protected $_someMember; public function __construct() { $this->_someMember = 1; } public static function getSomethingStatic() { return $this->_someMember * 5; // here's the catch } } 

A: Статические методы не имеют доступа к $ this, потому что статические методы могут быть выполнены без создания экземпляра класса.


В: В чем разница между интерфейсом и абстрактным классом?
A: Интерфейс определяет контракт между реализующим классом и объектом, который вызывает интерфейс. Абстрактный класс предопределяет определенное поведение для классов, которое расширяет его. В определенной степени это также можно рассматривать как договор, поскольку он гарантирует существование определенных методов.


В: Что не так с классами, которые в основном определяют геттеры и сеттеры, которые непосредственно сопоставляются с его внутренними членами, не имея фактически методов, которые выполняют поведение?
A: Это может быть запах кода, поскольку объект действует как облагороженный массив без особого использования.


В: Почему реализация PHP в использовании интерфейсов не оптимальна?
A: PHP не позволяет вам определить ожидаемый тип возвращаемого метода, что существенно упрощает использование интерфейсов. :-П

Определенно вопросы безопасности!

(простые ответы в этом посте, конечно, защита веб-приложений php намного сложнее)

  • как бороться с SQL-инъекцией?

mysql_real_escape_string () для начала с MySQL. Затем попробуйте изучить PDO, чтобы воспользоваться преимуществами подготовленных операторов и переносимости между поставщиками баз данных.

  • как бороться с CSRF (Подделка запросов на межсайтовый запрос)?

Добавьте маркер на каждый важный запрос для обеспечения важных операций (пользователь должен был увидеть форму перед отправкой важного запроса).

  • как отражать и хранить XSS (межсайтовые скрипты)?

htmlentities () хорош для начала.

  • вариант внедрения XXX: инъекция LDAP, инъекция XPath и т. д.?

Вам нужно знать, что такое «словарь», используемый XXX, а затем вычесть то, что вам нужно для дезинфекции и / или «проверки и отклонения».

  • каков список разумных функций?

Функции, которые интерпретируют PHP-код (возможно, включены в удаленный файл) или выполняют команду в вашей системе. Коротким и неполным списком могут быть: exec (), passthru (), system (), popen (), eval (), preg_replace () …

  • как бороться с опасностями включения файлов?
  • что такое трансверсальный путь?
  • каковы риски, связанные с загрузкой файлов?

Необходимо тщательно проверить параметры, используемые при открытии файла или удаленных ресурсов.

  • как обеспечить настройку конфигурации вашего PHP (т. е. знаете ли вы, что такое использование php.ini)?

Это будет долго, поэтому я пропущу ответ, пожалуйста, прочитайте руководство по PHP.

  • о фильтрации пользовательских данных: какая разница между дезинфекцией и проверкой и отказом ?

Первый превращает запись во что-то менее враждебное. Второй проверяет правильность записи и, если не откажется от нее.

«Почему вы не используете что-то еще?»

Извините, кто-то должен был сказать это 🙂

Является ли PHP-браузером?

(я знаю, это вызовет смех многих людей, но это вопрос более заданный на форумах php!)

Я думаю, что хороший вопрос: как работает HTTP? Работа с данными GET и POST среди других сообщений HTTP связана с развитием PHP. Понимание того, как работает HTTP в более широком контексте и как это реализует PHP, имеет большое значение.

В чем разница между == и === и почему вы хотите использовать == вообще?

Объясните, почему в следующем коде отображается 2.5 вместо 3 :

 $a = 012; echo $a / 4; 

Ответ. Когда в PHP число, которому предшествует 0 , число обрабатывается как восьмеричное число (base-8). Поэтому восьмеричное число 012 равно десятичному числу 10 .

Никто еще не затронул это, но это то, что каждый PHP-разработчик должен иметь возможность говорить подробно: почему register_globals плохо?

Когда сайт разрабатывается с использованием php, и это полный дерьмо, то это:

a) Ошибка PHP

b) Ошибка программистов

Какова наилучшая практика для избежания ввода пользователем? (Этот вопрос часто возникает)

  • При вызове элемента name из массива $ array, который является правильным:

    • $array[name]
    • $array['name']

    Оба часто работают, но только цитированная форма верна. define('name', 0); и наблюдайте, как мухи летят. Я слишком много видел это.

  • Как вы можете заставить элементы формы быть представлены в виде массива?

    Добавьте пустые скобки к атрибуту name: несколько элементов <input type="checkbox" name="checkboxes[]" /> будут преобразованы в массив на сервере (например, $_POST['checkboxes'][0..n] ). Я не думаю, что он на 100% специфичен для PHP, но он уверен, что цикл будет проходить через $_POST для всех возможных 'checkboxes'.$i Элемент 'checkboxes'.$i .

  • mysql_, mysqli_ или PDO?

    Только один неверный ответ здесь: библиотека mysql_ не делает подготовленных заявлений и больше не может оправдывать ее способность к злу. Именование функции, которую можно назвать несколько раз за каждый запрос, « mysql_real_escape_string() », является просто солью в ране.

«Какой твой любимый отладчик?»
«Какой твой любимый профайлер?»

Фактическое приложение / ide / frontend не имеет большого значения до тех пор, пока оно выходит за рамки «блокнот, эхо и microtime ()». Так маловероятно, что вы нанимаете одного из миллиарда разработчиков, который все время пишет совершенный код, а его / ее тесты проверяют все ошибки и узкие места, прежде чем они появятся, если вы хотите, чтобы кто-то, кто мог профанировать и / или проходить через код, и находить ошибок за конечное время. (Это верно для, вероятно, всех языков / платформ, но, похоже, для разработчиков php, как ни странно, недостаточно развиты навыки, чисто субъективные)

У Терри Чая есть сообщение в блоге, в основном обобщающее, что каждый PHP-разработчик должен знать и / или ожидать, чтобы в какой-то степени ответить на собеседование.

http://terrychay.com/article/php-coders.shtml

Я думаю, что это замечательное резюме.

Я бы спросил что-то вроде:

а) как насчет кеширования?

б) как можно организовать кеш?

c) Вы уверены, что вы не делаете дополнительных запросов к БД? (В моем первом материале, который я сделал на PHP, это был mysql_query внутри foreach, чтобы получить имена пользователей, которые сделали комментарии … ужасные :))

d) почему register_globals – зло?

e) почему и как вы должны разделить вид из кода?

f) какова основная цель «реализации»?

Вот вопросы, которые были не совсем понятны мне после того, как я прочитал некоторые основные книги. Я узнал все об инъекциях и csx, strpos через несколько дней в неделю через тысячи часто задаваемых вопросов в Интернете. Но пока я не нашел ответы на эти вопросы, мой код был действительно ужасным 🙂

Почему вы никогда не должны выводить пользовательский ввод напрямую!

Печать таких вещей, как данные из GET напрямую, может привести к уязвимости Cross-Site scripting (XSS) . Вот почему вы всегда должны отправлять входные данные от клиента через htmlspecialchars ().

Объясните разницу

экстракт ()

взорваться ()

лопаются ()

Что не так в следующем коде?

 $a = 2; function foo() { $a = 3; } foo(); echo $a;