Я проходил через Вопросы каждый хороший .Net разработчик должен был быть в состоянии ответить и был очень впечатлен содержанием и подходом к этому вопросу, и поэтому в том же духе я задаю этот вопрос для PHP Developer.
На какие вопросы , на ваш взгляд, должен ответить хороший программист PHP?
EDIT : Я отмечаю этот вопрос как вики сообщества, поскольку он не является специфичным для пользователя и нацелен на то, чтобы служить сообществу разработчиков в целом.
Надеемся на некоторые удивительные ответы.
ПРИМЕЧАНИЕ . Пожалуйста, ответьте на вопросы также, как это предлагается в комментариях, чтобы люди могли узнать что-то новое в отношении языка.
По общему признанию, я украл этот вопрос откуда-то еще (не могу вспомнить, где я его читал), но подумал, что это смешно:
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: $a
– 4
а $b
– 3
. Первый, поскольку $ 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 намного сложнее)
mysql_real_escape_string () для начала с MySQL. Затем попробуйте изучить PDO, чтобы воспользоваться преимуществами подготовленных операторов и переносимости между поставщиками баз данных.
Добавьте маркер на каждый важный запрос для обеспечения важных операций (пользователь должен был увидеть форму перед отправкой важного запроса).
htmlentities () хорош для начала.
Вам нужно знать, что такое «словарь», используемый XXX, а затем вычесть то, что вам нужно для дезинфекции и / или «проверки и отклонения».
Функции, которые интерпретируют PHP-код (возможно, включены в удаленный файл) или выполняют команду в вашей системе. Коротким и неполным списком могут быть: exec (), passthru (), system (), popen (), eval (), preg_replace () …
Необходимо тщательно проверить параметры, используемые при открытии файла или удаленных ресурсов.
Это будет долго, поэтому я пропущу ответ, пожалуйста, прочитайте руководство по 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;