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

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

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

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

Ожидание замечательных ответов.

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

Ответ 1

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

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

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

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


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


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


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


Q: Каков предпочтительный способ написать этот оператор 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: $a - 4, а $b - 3. Первое, потому что $arg передается по ссылке, последнее, потому что возвращаемое значение функции является копией (а не ссылкой) начального значения аргумента.


ООП

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


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

class SomeClass
{
    protected $_someMember;

    public function __construct()
    {
        $this->_someMember = 1;
    }

    public static function getSomethingStatic()
    {
        return $this->_someMember * 5; // here the catch
    }
}

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


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


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


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

Ответ 2

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

(простые ответы в этом сообщении, конечно, защита веб-приложений 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.

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

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

Ответ 3

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

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

Ответ 4

Перекрестный браузер php?

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

$a = 012;
echo $a / 4;

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

Ответ 8

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

Ответ 9

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

a) Ошибка PHPs

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

Ответ 10

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

Ответ 11

  • При вызове элемента "name" из массива $array, что правильно?:

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

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

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

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

  • mysql_, mysqli_ или PDO?

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

Ответ 12

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

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

Ответ 13

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

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

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

Ответ 14

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

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

b) как организовать кеш?

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

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

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

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

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

Ответ 15

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

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

Ответ 16

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

экстракт()

взрываются()

Implode()

Ответ 17

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

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