Вопросы каждый хороший разработчик PHP должен быть в состоянии ответить [закрыт]
Я шел через вопросы каждый хороший разработчик .Net должен быть в состоянии ответить и был очень впечатлен содержанием и подходом этого вопроса, и поэтому в том же духе я задаю этот вопрос для разработчика PHP.
какие вопросы как вы думаете, стоит хороший PHP-программист сможет ответить?
EDIT : Я отмечаю этот вопрос как сообщество wiki, поскольку он не является специфичным для пользователя и он направлен на обслуживание сообщества программирования в целом.
с нетерпением ждем некоторых удивительных ответов.
Примечание : ответьте, пожалуйста, на вопросы тоже, как предложено в комментариях, чтобы люди могли узнать что-то новое о языке.
17 ответов:
по общему признанию, я украл этот вопрос откуда-то еще (не могу вспомнить, где я его читал), но подумал, что это смешно:
Q: что это
T_PAAMAYIM_NEKUDOTAYIM
?
A: его оператор разрешения области (двойное двоеточие)опытный PHP ' ER сразу знает, что это значит. Менее опытные (и не иврит) разработчики могут захотеть прочитать этой.
но более серьезные вопросы теперь:
Q: что является причиной этого предупреждения: "предупреждение: не удается изменить информацию заголовка-заголовки уже отправлены", и что является хорошей практикой, чтобы предотвратить это?
A:причина: данные тела были отправлены, в результате чего заголовки будут отправлены тоже.
предупреждения: не забудьте сначала выполнить код заголовка, прежде чем выводить какие-либо данные тела. Убедитесь, что вы случайно не отправили пробелы или любые другие письмена.
Q: что не так с этим запросом:
"SELECT * FROM table WHERE id = $_POST[ 'id' ]"
?
A:1. это vulnarable для SQL инъекции. Никогда не используйте пользовательский ввод непосредственно в запросах. Сначала санируйте его. Предпочтительно использовать подготовленные операторы (PDO)2. не выделяйте все столбцы ( * ), но укажите каждый отдельный столбец. Это преимущественно ment, чтобы предотвратить запросы, засоряющие память, когда, например, добавляется столбец BLOB в какой-то момент в будущем.
Q: что не так с этим утверждением if:
if( !strpos( $haystack, $needle ) ...
?
A:strpos
возвращает позицию индекса, где он впервые нашел иглу$, которая может быть0
. Так как0
также решаетfalse
решение заключается в использовании строгого сравнения:if( false !== strpos( $haystack, $needle )...
Q: что это предпочтительный способ, чтобы написать это, если заявление, и почему?
if( 5 == $someVar )
илиif( $someVar == 5 )
A: первый, так как он предотвращает случайное присвоение от 5 до $ someVar, когда вы забываете использовать 2 знака равенства ($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's the catch } }
A: статические методы не имеют доступа к $this, потому что статические методы могут выполняться без создания экземпляра класса.
Q: в чем разница между интерфейсом и абстрактным классом?
A: интерфейс определяет контракт между реализация класса - это и объект, который вызывает интерфейс. Абстрактный класс заранее определяет определенное поведение для классов, которые будут его расширять. В определенной степени это также можно считать контрактом, поскольку он гарантирует существование определенных методов.
Q: что не так с классами, которые преимущественно определяют геттеры и сеттеры, которые отображают прямо на его внутренние члены, фактически не имея методов, которые выполняют поведение?
A: это может быть запах кода, так как объект действует как облагороженный массив, без особого другого использования.
Q: почему реализация PHP использования интерфейсов неоптимальна?
A: PHP не позволяет вам определить ожидаемый тип возврата метода, который по существу делает интерфейсы довольно бесполезными. :- P
окончательно вопросы безопасности !
(простые ответы в этом посте, конечно, защита веб-приложений php намного сложнее)
- как бороться с SQL-инъекций ?
mysql_real_escape_string () для начала с MySQL. Затем попробуйте изучить PDO, чтобы воспользоваться подготовленными инструкциями и переносимостью между поставщиками баз данных.
- как бороться с CSRF (подделка межсайтового запроса) ?
добавить маркер на каждом важном запросе для защиты важных операций (пользователь должен был видеть форму перед отправкой критического запроса).?
- как бороться с XSS (межсайтовый скриптинг) отражены и сохранены ?
htmlentities () хорошо для начала.
- вариант впрысок XXX: впрыска LDAP, впрыска XPath, etc... ?
вы должны знать, что такое "словарь", используемый XXX, а затем вычесть то, что вам нужно санировать и / или"проверить и отклонить".
- каков список разумных функций ?
функции, которые интерпретируют PHP-код (возможно, включенный в удаленный файл) или которые выполняют команду в вашей системе. Короткий и неполный список может быть: метод exec(), пропускания(), системы(), к popen(), функция eval () код preg_replace()...
- как бороться с опасностями включения файлов ?
- что такое поперечный путь?
- каковы риски связано с загрузкой файлов ?
требуется тщательная проверка параметров, используемых при открытии файла или удаленных ресурсов.
- как применить конфигурацию вашей конфигурации PHP (т. е. вы знаете, что такое использование php.ini) ?
Это будет долго, поэтому я пропускаю ответ, пожалуйста, прочитайте руководство PHP.
- о фильтрации пользовательских данных: в чем разница между очистка и проверить и отказать ?
первый преобразует запись в нечто менее враждебное. Второй проверяет правильность записи и, если нет, то отказывается от нее.
является ли php кроссбраузерным?
(Я знаю, это сделает laught много людей, но это более-заданный вопрос на PHP форумах!)
Я думаю, что хороший будет вопрос: как работает HTTP? работает с
GET
иPOST
данные среди других HTTP-коммуникаций присущи разработке PHP. Понимание того, как HTTP работает в более широком контексте и как PHP реализует это, проходит долгий путь.
объясните, почему отображается следующий код
2.5
вместо3
:$a = 012; echo $a / 4;
ответ: когда число предшествует
0
в PHP число обрабатывается как восьмеричной (основание-8). Поэтому восьмеричное число012
равно десятичному числу10
.
никто еще не касался этого, но это то, о чем каждый разработчик PHP должен иметь возможность говорить подробно: почему
register_globals
плохо?
когда сайт разрабатывается с использованием php и это полное дерьмо, это:
a) ошибка PHPs
б) программисты вина
при вызове элемента "name" $array, который является правильным?:
$array[name]
$array['name']
оба часто работают, но только цитируемая форма правильна.
define('name', 0);
и смотреть, как летают жуки. Я видел это слишком много.как вы можете заставить элементы формы быть представлены в виде массива?
добавьте пустые скобки к атрибуту name: multiple
<input type="checkbox" name="checkboxes[]" />
элементы будут преобразуется в массив на сервере (например$_POST['checkboxes'][0..n]
). Я не думаю, что это 100% PHP-специфичный, но он наверняка бьет цикл через$_POST
для каждого'checkboxes'.$i
элемент.mysql_, mysqli_ или PDO?
только один действительно неправильный ответ здесь: библиотека mysql_ не делает подготовленных заявлений и больше не может оправдывать свою способность к злу. Называя функцию, предполагается, что она будет вызываться несколько раз за выполненный запрос, "
mysql_real_escape_string()
", это просто соль в рана.
" какой ваш любимый отладчик?"
-Какой твой любимый профилировщик?"фактическое приложение / ide / frontend не имеет большого значения, если оно выходит за рамки " notepad, echo и microtime ()". Это настолько маловероятно, что вы нанимаете одного из миллиарда разработчиков, который все время пишет идеальный код, и его/ее модульные тесты обнаружили все ошибки и узкие места, прежде чем они даже произойдут, что вам нужен кто-то, кто может профилировать и/или проходить через код и находить ошибки в конечное время. (Это верно, вероятно, для всех языков / платформ, но мне кажется, что это немного недоразвитый набор навыков среди разработчиков php, чисто субъективный)
у Терри чей есть сообщение в блоге, в основном обобщающее то, что каждый разработчик PHP должен знать и/или ожидать ответа в какой-то степени на собеседовании.
http://terrychay.com/article/php-coders.shtml
Я думаю, что многие резюме.
Я бы спросил что-то вроде:
а) насчет кэширования?
b) как можно организовать кэш?
c) вы уверены, что не делаете дополнительных запросов к БД? (В моем первом материале, который я сделал на PHP, это был mysql_query внутри foreach, чтобы получить имена пользователей, которые сделали комментарии... ужасно :))
d) почему register_globals-это зло?
е) почему и как вы должны разделить представление от кода?
f) какова основная цель "реализовать"?
вот вопросы, которые были не совсем ясны для меня после того, как я прочитал некоторые основные книги. Я узнал все о инъекциях и csx, strpos за несколько дней\недель через тысячи часто задаваемых вопросов в интернете. Но пока я не нашел ответы на эти вопросы, мой код был действительно ужасен :)
Почему вы никогда не должны выводить пользовательский ввод напрямую!
печать таких вещей, как данные из GET напрямую может привести к межсайтовые скрипты (XSS) уязвимостей. Вот почему вы всегда должны отправлять входные данные от клиента через htmlspecialchars() в первую очередь.