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


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

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

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

с нетерпением ждем некоторых удивительных ответов.

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

17 75
php

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() в первую очередь.

объяснить разницу

extract ()

explode ()

implode ()

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

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