1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/colinlet-PHP-Interview-QA

В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
QA.md 34 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 07.06.2025 02:59 3ec28ef

Вопросы и краткие ответы

PHP раздел

Отличия echo, print, print_r, var_dump

echo и print являются структурами языка, print_r и var_dump — обычными функциями

  • echo: выводит один или несколько строк
  • print: выводит строку
  • print_r: выводит понятную информацию о переменной
  • var_dump: выводит понятную информацию о переменной (с типом) Дополнительная информация [«Отличия echo, print, print_r, var_dump»](./03.echo, print, print_r, var_dump отличия.md)

Отличия одинарных и двойных кавычек

Двойные кавычки могут быть интерпретированы анализатором, одинарные — нет

Отличия isset и empty

isset: проверяет, установлено ли значение переменной и не равно ли оно NULL empty: проверяет, является ли переменная пустой, переменная равная 0 или false также считается пустой; отсутствие переменной не вызывает предупреждений

Отличия static, self, $this

static: static может использоваться в статических или нестатических методах, может обращаться к статическим свойствам, методам, константам и нестатическим методам класса, но не может обращаться к нестатическим свойствам self: может использоваться для обращения к статическим свойствам, методам и константам класса, но self указывает на класс, в котором он определен, что является ограничением self $this: указывает на объект, который был вызван, то есть, в процессе выполнения, если объект вызывает свойства или методы класса, $this указывает на этот объект.Однако $this не может обращаться к статическим свойствам и константам, а также не может использоваться в статических методах.

Отличия include, require, include_once, require_once

require и include почти полностью идентичны, за исключением способа обработки ошибок. Require при ошибке генерирует ошибку уровня E_COMPILE_ERROR, что приводит к остановке выполнения скрипта, в то время как include генерирует предупреждение (E_WARNING), и скрипт продолжает выполнение. Include_once включает и выполняет указанный файл во время выполнения скрипта. Это поведение похоже на include, единственное отличие заключается в том, что если файл уже был включен, он не будет включен снова. Как и подразумевает его имя, он включает файл только один раз.

Часто используемые функции для работы с массивами

array_count_values — подсчитывает все значения в массиве. array_flip — меняет местами ключи и значения в массиве. array_merge — объединяет один или несколько массивов. array_multisort — сортирует несколько массивов или многомерный массив. array_pad — заполняет массив значением до указанной длины. array_pop — извлекает последний элемент из массива (выталкивает элемент). array_push — добавляет один или несколько элементов в конец массива (вталкивает элемент). array_rand — случайным образом (псевдослучайным образом) выбирает один или несколько элементов из массива. array_keys — возвращает ключи массива или части ключей. array_values — возвращает значения массива.count — Подсчитывает количество элементов в массиве или количество свойств в объекте
sort — Сортирует массив

Куки и Сессии

Куки: PHP поддерживает HTTP-куки. Куки — это механизм хранения данных на стороне клиента для отслеживания и идентификации пользователей.
Сессии: Механизм сессий в PHP используется для хранения данных, связанных с пользователем, при его непрерывном доступе к веб-приложению.

Предопределенные переменные

PHP предоставляет множество предопределенных переменных для всех скриптов.
Суперглобальные переменные — Суперглобальные переменные доступны во всех областях видимости.

$GLOBALS — Ссылка на все переменные, доступные в глобальной области видимости  
$_SERVER — Информация о сервере и окружении  
$_GET — Переменные HTTP GET  
$_POST — Переменные HTTP POST  
$_FILES — Переменные HTTP для загрузки файлов  
$_REQUEST — Переменные HTTP Request  
$_SESSION — Переменные сессии  
$_ENV — Переменные окружения  
$_COOKIE — HTTP Куки  
$php_errormsg — Сообщение об ошибке  
$HTTP_RAW_POST_DATA — Нераспаршенные данные POST  
$http_response_header — HTTP Заголовки ответа  
$argc — Количество переданных аргументов  
$argv — Массив переданных аргументов  
  • Суперглобальные переменные
    Многие предопределенные переменные в PHP являются "суперглобальными", что означает, что они доступны во всех областях видимости скрипта. В функциях или методах нет необходимости использовать global $variable; для доступа к ним.Суперглобальные переменные: $GLOBALS, $_SERVER, $_GET, $_POST, $_FILES, $_COOKIE, $_SESSION, $_REQUEST, $_ENV

Передача по значению и по ссылке

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

Конструкторы и деструкторы

Конструктор: PHP 5 позволяет разработчикам определить метод как конструктор в классе. Классы с конструктором вызывают этот метод при каждом создании нового объекта, что делает его идеальным для выполнения инициализации перед использованием объекта. Деструктор: PHP 5 ввёл концепцию деструктора, аналогичную другим объектно-ориентированным языкам, таким как C++. Деструктор вызывается, когда все ссылки на объект удалены или когда объект явно уничтожен.

Магические методы

Методы __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke() и другие в PHP называются "магическими методами" (magic methods).

Отличия public, protected, private, final

Управление доступом к свойствам или методам осуществляется путем добавления ключевых слов public (общедоступный), protected (защищённый) или private (частный) перед ними. Элементы класса, объявленные как общедоступные, могут быть доступны из любого места.PHP 5 ввёл ключевое слово final. Если метод в родительском классе объявлен как final, то его нельзя переопределить в дочернем классе. Если класс объявлен как final, то его нельзя наследовать.

Получение IP-адреса клиента и сервера, понимание прокси-транспаранта и реального IP-адреса

  • IP-адрес клиента: $\_{SERVER}['REMOTE_ADDR']$
  • IP-адрес сервера: $\_{SERVER}['SERVER_ADDR']$
  • IP-адрес клиента (через прокси-транспарант): $\_{SERVER}['HTTP_X_FORWARDED_FOR']$

Статический вызов и инстанцирование класса

  • Занимаемая память Статические методы хранятся в памяти только один раз, независимо от того, сколько раз они вызываются. Каждое инстанцирование класса создает отдельный объект, который занимает отдельное место в памяти.
  • Различия Статические методы можно вызывать без инстанцирования класса. Статические методы не могут вызывать нестатические свойства, так как последние требуют инстанцирования и хранятся в объекте. Статические методы могут вызывать нестатические методы, используя ключевое слово self. В PHP метод, вызываемый через self::, автоматически становится статическим. Вызов статического метода класса не приводит к автоматическому вызову конструктора класса.

Вызов метода без инстанцирования в PHP

Статический вызов, использование PHP-рефлексии.### Параметры конфигурации php.ini

  • Параметры конфигурации | Имя | Значение по умолчанию | Примечание | | --- | --- | --- | | short_open_tag | "1" | Включение сокращенной формы (<? ?>) | | precision | "14" | Количество знаков после запятой для чисел с плавающей запятой | | disable_functions | "" | Запрет на использование определенных функций | | disable_classes | "" | Запрет на использование определенных классов | | expose_php | "" | Отображение информации о том, что PHP установлен на сервере | | max_execution_time | 30 | Максимальное время выполнения скрипта | | memory_limit | 128M | Максимальное количество памяти, доступное для каждого скрипта | | error_reporting | NULL | Уровень отчета об ошибках E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED | | display_errors | "1" | Отображение ошибок | | log_errors | "0" | Запись ошибок в файл error_log | | error_log | NULL | Файл, в который будут записываться ошибки скрипта | | upload_max_filesize | "2M" | Максимальный размер загружаемого файла | | post_max_size | "8M" | Максимальный размер данных POST |```shell php -ini | grep short_open_tag # просмотр параметров конфигурации php.ini

- Динамическое изменение параметров
```php
ini_set(string $varname, string $newvalue);
ini_set('date.timezone', 'Asia/Shanghai'); # установка часового пояса
ini_set('display_errors', '1'); # отображение ошибок
ini_set('memory_limit', '256M'); # установка максимального лимита памяти
```### Конфигурация php-fpm. conf
 |Название|По умолчанию|Примечания|
 |---|---|---|
 |pid||Путь к файлу PID|
 |error_log||Путь к файлу с ошибками|
 |log_level|notice|Уровень логирования: alert - требует немедленного вмешательства, error - ошибка, warning - предупреждение, notice - важная информация, debug - отладочная информация|
 |daemonize|yes|Установка FPM для работы в фоновом режиме|
 |listen|ip:port, port, /path/to/unix/socket|Адрес, по которому FPM будет принимать запросы FastCGI|
 |pm|static, ondemand, dynamic|Способ управления дочерними процессами процесс-менеджером|
 |request_slowlog_timeout|'0'|Пороговое значение для записи медленных запросов в журнал|
 |slowlog||Путь к журналу медленных запросов|
 
### Причины возникновения ошибок 502, 504 и способы их решения
#### Ошибка 502
Ошибка 502 означает ошибку шлюза. Когда PHP-CGI получает недействительный ответ, шлюз выводит эту ошибку.
- Значение параметра memory_limit в php. ini слишком маленькое
- Некорректные значения параметров max_children и max_requests в php-fpm. conf
- Некорректные значения параметров request_terminate_timeout и max_execution_time в php-fpm. conf
- Недостаточное количество процессов для обработки запросов, проблемы с производительностью скриптов

#### Ошибка 504
Ошибка 504 означает, что шлюз не получил ответ от PHP-CGI в течение заданного времени. Шлюз выводит эту ошибку.
- В стеке Nginx+PHP можно настроить время ожидания FastCGI: fastcgi_connect_timeout, fastcgi_send_timeout, fastcgi_read_timeout

#### Ошибка 500
Проблемы с PHP-кодом, проблемы с правами доступа к файлам, проблемы с ресурсами

#### Ошибка 503
Проблемы с доступом к серверу, недоступность сервера, проблемы с правами доступа к файламПерегрузка или техническое обслуживание
### Как вернуть 301-перенаправление
```php
header('HTTP/1.1 301 Moved Permanently');
header('Location: https://blog.maplemark.cn');

Способы подключения PHP к MySQL

MySQL

$conn = mysql_connect('127.0.0.1:3306', 'root', '123456');
if (!$conn) {
    die(mysql_error() . "\n");
}
mysql_query("SET NAMES 'utf8'");
$select_db = mysql_select_db('app');
if (!$select_db) {
    die(mysql_error() . "\n");
}
$sql = "SELECT * FROM `user` LIMIT 1";
$res = mysql_query($sql);
if (!$res) {
    die(mysql_error() . "\n");
}
while ($row = mysql_fetch_assoc($res)) {
    var_dump($row);
}
mysql_close($conn);

MySQLi

$conn = @new mysqli('127.0.0.1:3306', 'root', '123456');
if ($conn->connect_errno) {
    die($conn->connect_error . "\n");
}
$conn->query("set names 'utf8';");
$select_db = $conn->select_db('user');
if (!$select_db) {
    die($conn->error . "\n");
}
$sql = "SELECT * FROM `user` LIMIT 1";
$res = $conn->query($sql);
if (!$res) {
    die($conn->error . "\n");
}
while ($row = $res->fetch_assoc()) {
    var_dump($row);
}
$res->free();
$conn->close();

PDO

$pdo = new PDO('mysql:host=127.0.0.1:3306;dbname=user', 'root', '123456');
$pdo->exec("set names 'utf8'");
$sql = "SELECT * FROM `user` LIMIT 1";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(1, 1, PDO::PARAM_STR);
$rs = $stmt->execute();
if ($rs) {
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        var_dump($row);
    }
}
$pdo = null;

Различия между MySQL, MySQLi и PDO

MySQL

  • Раннее расширение для взаимодействия PHP-приложений с базами данных MySQL
  • Предоставляет процедурный интерфейс, не поддерживающий некоторые более поздние возможности

MySQLi

  • Объектно-ориентированный интерфейс
  • Поддержка подготовленных запросов
  • Поддержка выполнения нескольких запросов
  • Поддержка транзакций
  • Улучшенная возможность отладки

PDO

  • Абстрактный слой для работы с базами данных в PHP-приложениях- PDO предоставляет унифицированный API-интерфейс, не требуя учитывать тип базы данных.
  • Использование стандартного API PDO позволяет быстро и без проблем переключаться между различными типами баз данных.

Постоянные соединения с базой данных

Это метод использования PHP в качестве модуля для многопоточного веб-сервера, такого как Apache. Для многопоточного сервера характерно наличие родительского процесса и группы дочерних процессов, которые работают вместе. Дочерние процессы отвечают за создание веб-страниц. Когда клиент обращается к родительному процессу, запрос передается свободному дочернему процессу. Это означает, что при повторном обращении к серверу одним и тем же клиентом, запрос может быть обработан другим дочерним процессом. После установления постоянного соединения все последующие запросы к базе данных могут использовать уже установленное соединение.

Процесс выполнения кода

PHP-код => Запуск PHP и Zend-движка, загрузка зарегистрированных расширений => Лексический/синтаксический анализ кода => Компиляция в opcode (opcache) => Выполнение opcode

В PHP7 добавлено абстрактное синтаксическое дерево (AST), которое генерируется на этапе синтаксического анализа, а затем используется для генерации массива opcode.

Принцип работы base64-кодирования

Реализация ip2long

Понимание MVC

MVC включает три типа объектов.Модель (Model) представляет объекты приложения, представление (View) — их отображение на экране, а контроллер (Controller) — определяет, как пользовательский интерфейс реагирует на ввод пользователя. Без использования MVC, пользовательский интерфейс часто объединяет эти объекты, в то время как MVC разделяет их для повышения гибкости и повторного использования.

Основные характеристики популярных PHP-фреймворков

Laravel

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

  • Быстрый и простой маршрутизатор
  • Мощный контейнер внедрения зависимостей
  • Выразительный и интуитивно понятный ORM для работы с базами данных
  • Поддержка миграций баз данных
  • Гибкий планировщик задач
  • Реальное время рассылка событий

Symfony

  • Независим от движка баз данных
  • Прост в использовании, в большинстве случаев, но достаточно гибок для адаптации к сложным случаям
  • Основан на принципе конвенций вместо конфигурации — разработчику нужно конфигурировать только нестандартные случаи
  • Соответствует большинству лучших практик веб-разработки и шаблонам проектирования
  • Готов к работе в корпоративной среде — адаптируется к существующим политикам и архитектурам информационных технологий (IT), и стабилен для длительных проектов
  • Очень читаемый код с комментариями phpDocumentor для удобства поддержки- Прост в расширении, позволяя интеграцию с библиотеками других поставщиков

    CodeIgniter

    • Система на основе модели-представления-контроллера
    • Легковесный фреймворк
    • Полнофункциональный класс для работы с базами данных, поддерживающий несколько платформ
    • Поддержка Query Builder для работы с базами данных
    • Формы и валидация данных
    • Безопасность и фильтрация XSS
    • Полное кэширование страниц

    ThinkPHP

    • Использует контейнер для единой управляющей объектами
    • Поддержка Facade
    • Более удобный маршрутизатор
    • Поддержка аннотаций маршрутов
    • Поддержка маршрутизации для запросов с��越请求
  • Улучшенный класс валидации
  • Конфигурация и маршрутизация в отдельных директориях
  • Отмена системных констант
  • Механизм псевдонимов для классов
  • Улучшенные модели и работа с базами данных
  • Усовершенствованное внедрение зависимостей
  • Поддержка PSR-3 для логирования
  • Поддержка middleware
  • Поддержка Swoole/Workerman для выполнения

    Объектно-реляционное отображение/ORM

    Преимущества

    • Сокращение времени написания кода, уменьшение или исключение необходимости в кодировании моделей, снижение затрат на изучение баз данных
  • Динамическое отображение таблиц данных, что позволяет уменьшить изменения кода при изменении структуры таблиц
  • Возможность удобного добавления дополнительных функций (слоя кэширования)

Недостатки

  • Увеличение затрат на производительность из-за отображения, увеличение использования памяти ORM-объектами
  • При сложных SQL-запросах, читаемость ORM-синтаксиса снижается (использование нативных SQL-запросов)

Реализация цепочки вызовов

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

Обработка исключений

set_exception_handler — Установка пользовательской функции обработки исключений Использование try / catch для перехвата исключений

Как реализовать асинхронные вызовы

$fp = fsockopen("blog.maplemark.cn", 80, $errno, $errstr, 30);
if (!$fp) {
   echo "$errstr ($errno)<br />\n";
} else {
   $out = "GET /backend.php/ HTTP/1.1\r\n";
   $out .= "Host: blog.maplemark.cn\r\n";
   $out .= "Connection: Close\r\n\r\n";
   fwrite($fp, $out);
```### Объектно-реляционное отображение/ORM
#### Преимущества
- Сокращение времени кодирования, уменьшение или исключение необходимости в кодировании моделей, снижение затрат на изучение баз данных
- Динамическое отображение таблиц, что позволяет уменьшить изменения кода при изменении структуры таблиц
- Легкое добавление дополнительных функций (слоя кэширования)
#### Недостатки
- Потребление производительности при отображении, использование памяти при работе с объектами ORM
- Низкая читаемость ORM-синтаксиса при сложных SQL-запросах (использование нативных SQL-запросов)
### Реализация цепного вызова
Класс определяет встроенный переменной, чтобы другие методы в классе могли к ней обращаться
### Обработка исключений
set_exception_handler — Установка пользовательской функции обработки исключений
Использование try / catch для перехвата исключений
### Как реализовать асинхронный вызов
```php
$fp = fsockopen("blog.maplemark.cn", OnClickListener 80, $errno, $errstr, 30);
if (! $fp) {
 echo "$errstr ($errno)<br />\n";
} else {
 $out = "GET /backend.php/ HTTP/1. 1\r\n";
 $out .= "Host: blog.maplemark.cn\r\n";
 $out .= "Connection: Close\r\n\r\n";
 fwrite($fp, $out);
}

Построение одного файла несколькими процессами параллельно

Закрытие, очередь

Модель процессов PHP, способы коммуникации процессов, различия между процессами и потоками

Очереди сообщений, сокеты, семафоры, общая память, сигналы, каналы

Функции PHP, поддерживающие обратные вызовы, реализация одной из них

array_map, array_filter, array_walk, usort is_callable + обратные вызовы + анонимные функции

Какие есть способы отправки HTTP-запросов, в чем их различия

cURL, file_get_contents, fopen, fsockopen

Какой из методов php for, while, foreach наиболее эффективен при итерации массива

Как реализуются слаботипизированные переменные

Переменные, объявленные в PHP, хранятся в структурах zval в движке Zend, слаботипизированные переменные реализуются через объединения

Инициализация расширения PHP

  • Инициализация расширения
$ php /php-src/ext/ext_skel.php --ext
```- Определение функций расширения
zend_module_entry определяет имя расширения, а PHP_FUNCTION определяет функции.
- Компиляция и установка
```shell
$ phpize $ . /configure $ make && make install

Как получить путь установки расширения

Механизм сбора мусора

Счетчик ссылок

Trait

С версии PHP 5.4.0 в PHP реализован метод повторного использования кода, называемый trait.

Что такое yield, укажите сценарий использования, а также основные принципы работы yield

Функция-генератор выглядит как обычная функция, но вместо возврата одного значения она может генерировать множество значений, которые ей требуются.

Различия между trait и interface, а также проблемы, которые решает trait

Как итерировать объект с помощью foreach, как выполнять операции с массивом на объекте $obj[key], как выполнять функциональные операции на объекте $obj(123);

Сценарии использования Swoole, реализация корутин

А вы знаете модель процессов Swoole?

Внутренняя реализация массива PHP (HashTable + Linked list)

Принцип Copy on write, когда происходит сборка мусора

Как решить проблему переполнения памяти в PHP

ZVAL

HashTable

Новые возможности PHP7

Декларация скалярных типов, декларация типа возвращаемого значения, определение массива констант через define(), анонимные классы, одновременное импортирование классов из одного пространства имен.

Внутренние оптимизации PHP7

Оптимизация структуры ZVAL, размер уменьшен с 24 до 16 байт.Внутренний тип zend_string использует char массив, а не char*.
Внутренняя реализация массива PHP изменена с hashtable на zend array.
Оптимизация механизма вызова функций, уменьшение количества инструкций за счет оптимизации передачи параметров.

Введение в PSR, PSR-1, 2, 4, 7

   ### Принципы сравнения строк и чисел, обратите внимание на восьмеричные числа с нулем в начале, шестнадцатеричные числа с префиксом 0x
   ### Что такое BOM-заголовок и как его удалить
   ### Что такое движок шаблонов, для решения каких проблем он используется, принципы реализации (Smarty, Twig, Blade)

Опубликовать ( 0 )

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

1
https://api.gitlife.ru/oschina-mirror/colinlet-PHP-Interview-QA.git
git@api.gitlife.ru:oschina-mirror/colinlet-PHP-Interview-QA.git
oschina-mirror
colinlet-PHP-Interview-QA
colinlet-PHP-Interview-QA
master