Вопросы каждый хороший 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;