Почему
В PHP функция
🔍 Почему
Пустой массив
🔍 Почему
При приведении пустого массива к объекту
⚠️ Важность различия
В JSON пустой массив
✅ Как контролировать результат
🔸Чтобы получить пустой объект в JSON, приведите массив к объекту:
🔸 Чтобы получить пустой массив, используйте
Будьте осторожны с флагом
json_encode([]) === '[]', но json_encode((object)[]) === '{}'?В PHP функция
json_encode() преобразует структуры данных в строки JSON. Результат зависит от типа передаваемой структуры: массив или объект.🔍 Почему
json_encode([]) возвращает '[]'Пустой массив
[] в PHP интерпретируется как последовательный массив без ключей. При преобразовании в JSON он становится пустым массивом: '[]'.🔍 Почему
json_encode((object)[]) возвращает '{}'При приведении пустого массива к объекту
(object)[] получается экземпляр класса stdClass без свойств. При кодировании в JSON он становится пустым объектом: '{}'.⚠️ Важность различия
В JSON пустой массив
'[]' и пустой объект '{}' — разные типы данных. Это различие может быть критичным при взаимодействии с API или клиентскими приложениями, ожидающими определённый тип данных.✅ Как контролировать результат
json_encode()🔸Чтобы получить пустой объект в JSON, приведите массив к объекту:
(object)[].🔸 Чтобы получить пустой массив, используйте
[].Будьте осторожны с флагом
JSON_FORCE_OBJECT, так как он преобразует все массивы в объекты, что может привести к нежелательным результатам.❤2
Как использовать каталог хранилищ в Laravel?
Laravel предоставляет каталог хранения, который можно использовать для хранения файлов и других данных, которые не должны быть общедоступными.
В этом примере мы сохраняем файл в каталоге
Laravel предоставляет каталог хранения, который можно использовать для хранения файлов и других данных, которые не должны быть общедоступными.
В этом примере мы сохраняем файл в каталоге
uploads внутри каталога storage с помощью метода store. Затем мы можем получить файл с помощью метода get и удалить его с помощью метода delete.Как защититься от SQL-инъекций без prepared statements?
🔐 Альтернативные способы защиты от SQL-инъекций без prepared statements
1. Экранирование пользовательского ввода
Для MySQL можно использовать функцию
Однако этот метод не защищает от всех видов атак и может быть недостаточно эффективным, особенно если не учитывать кодировку и типы данных.
2. Приведение типов и валидация данных
Если ожидается, что пользовательский ввод должен быть определённого типа (например, целое число), следует явно приводить его к этому типу и проверять допустимость значения.
Это предотвращает внедрение вредоносного кода через параметры, ожидающие числовые значения.
3. Белые списки допустимых значений
Для параметров, которые могут принимать ограниченный набор значений (например, порядок сортировки), следует использовать белые списки и проверять, что введённое значение входит в допустимый набор.
Это предотвращает возможность внедрения произвольного SQL-кода через параметры.
4. Использование хранимых процедур
Хранимые процедуры, определённые на стороне базы данных, могут помочь изолировать SQL-логику от пользовательского ввода. Однако они также могут быть уязвимы, если параметры не обрабатываются должным образом.
⚠️ Почему эти методы менее надёжны
🔸 Экранирование и валидация требуют тщательной реализации и могут быть легко нарушены при изменении кода.
🔸 Ошибки в логике проверки или упущенные случаи могут открыть путь для атак.
🔸 Эти методы не обеспечивают такой же уровень защиты, как подготовленные выражения, особенно при работе с различными типами данных и кодировками.
🔐 Альтернативные способы защиты от SQL-инъекций без prepared statements
1. Экранирование пользовательского ввода
Для MySQL можно использовать функцию
mysqli_real_escape_string(), которая экранирует специальные символы в строке, делая её безопасной для использования в SQL-запросах.$login = mysqli_real_escape_string($conn, $_POST['login']);
$query = «SELECT * FROM users WHERE login = '$login'»;
Однако этот метод не защищает от всех видов атак и может быть недостаточно эффективным, особенно если не учитывать кодировку и типы данных.
2. Приведение типов и валидация данных
Если ожидается, что пользовательский ввод должен быть определённого типа (например, целое число), следует явно приводить его к этому типу и проверять допустимость значения.
$id = (int)$_GET['id'];
$query = «SELECT * FROM products WHERE id = $id»;
Это предотвращает внедрение вредоносного кода через параметры, ожидающие числовые значения.
3. Белые списки допустимых значений
Для параметров, которые могут принимать ограниченный набор значений (например, порядок сортировки), следует использовать белые списки и проверять, что введённое значение входит в допустимый набор.
$order = $_GET['order'];
if (!in_array($order, ['ASC', 'DESC'])) {
$order = 'ASC';
}
$query = «SELECT * FROM products ORDER BY price $order»;
Это предотвращает возможность внедрения произвольного SQL-кода через параметры.
4. Использование хранимых процедур
Хранимые процедуры, определённые на стороне базы данных, могут помочь изолировать SQL-логику от пользовательского ввода. Однако они также могут быть уязвимы, если параметры не обрабатываются должным образом.
⚠️ Почему эти методы менее надёжны
🔸 Экранирование и валидация требуют тщательной реализации и могут быть легко нарушены при изменении кода.
🔸 Ошибки в логике проверки или упущенные случаи могут открыть путь для атак.
🔸 Эти методы не обеспечивают такой же уровень защиты, как подготовленные выражения, особенно при работе с различными типами данных и кодировками.
❤1👍1🤔1😢1
Forwarded from Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter
Ищем человека в команду, который будет вести наши каналы по PHP. Нам нужен не душный сеньор-помидор, а тот, кто реально любит язык, следит за ним и может интересно рассказать об этом другим.
ЧТО ПО ЗАДАЧАМ?
Всё просто — ты ведёшь три канала (основной, задачи и собесы):
КОГО ИЩЕМ?
УСЛОВИЯ:
Харэ сачковать — заполняй анкету
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Как в PHP очистить память?
В PHP память очищается автоматически после окончания выполнения скрипта. Однако, есть несколько способов управлять памятью для оптимизации работы скрипта:
1. Очистка переменных: Удалив все ссылки на объект или массив, PHP автоматически освободит память, занимаемую ими. Использование функции
2. Освобождение памяти после работы с большими массивами: Для этого можно использовать функцию
3. Использование
4. Использование
5. Управление памятью экстенсионных функций: Если используются расширения PHP, следует обратить внимание на их документацию, так как некоторые расширения могут предоставлять специальные функции для управления памятью.
Но в целом, в PHP не требуется явно очищать память, так как это автоматически выполняется сборщиком мусора. Однако, правила управления памятью в PHP важно понимать, чтобы написанный код был максимально эффективным и не вызывал утечек памяти.
В PHP память очищается автоматически после окончания выполнения скрипта. Однако, есть несколько способов управлять памятью для оптимизации работы скрипта:
1. Очистка переменных: Удалив все ссылки на объект или массив, PHP автоматически освободит память, занимаемую ими. Использование функции
unset() позволяет явно удалить переменную или ее элементы.2. Освобождение памяти после работы с большими массивами: Для этого можно использовать функцию
unset() или присвоить переменной пустое значение ($var = null), чтобы удалить ссылку на массив и освободить память.3. Использование
unset() после работы с объектами: Аналогично предыдущему пункту, нужно удалить ссылку на объект, чтобы очистить память. Если объект был инициализирован с помощью конструктора, то вызов unset() может привести к вызову деструктора объекта.4. Использование
gc_collect_cycles(): Функция gc_collect_cycles() используется для принудительного вызова сборщика мусора, который освобождает память, занимаемую неиспользуемыми объектами и циклами ссылок.5. Управление памятью экстенсионных функций: Если используются расширения PHP, следует обратить внимание на их документацию, так как некоторые расширения могут предоставлять специальные функции для управления памятью.
Но в целом, в PHP не требуется явно очищать память, так как это автоматически выполняется сборщиком мусора. Однако, правила управления памятью в PHP важно понимать, чтобы написанный код был максимально эффективным и не вызывал утечек памяти.
Что означает сложность алгоритма?
Сложность алгоритма представляет собой меру его эффективности и определяет количество ресурсов, таких как время и память, необходимых для его выполнения.
Существуют два основных типа сложности алгоритма: временная сложность и пространственная сложность.
Временная сложность алгоритма оценивает время, необходимое для его выполнения, в зависимости от размера входных данных. Обычно время выполнения алгоритма измеряется в тактах процессора или в секундах. Примеры временной сложности включают константную сложность O(1) (выполнение за постоянное время), линейную сложность O(n) (выполнение занимает время, пропорциональное размеру входных данных) и квадратичную сложность O(n^2) (выполнение занимает время, пропорциональное квадрату размера входных данных).
Пространственная сложность алгоритма оценивает объем памяти, необходимый для его выполнения, в зависимости от размера входных данных. Обычно пространственная сложность измеряется в байтах. Примеры пространственной сложности включают константную сложность O(1) (не зависит от размера входных данных), линейную сложность O(n) (потребляет память, пропорционально размеру входных данных) и квадратичную сложность O(n^2) (потребляет память, пропорционально квадрату размера входных данных).
Сложность алгоритма представляет собой меру его эффективности и определяет количество ресурсов, таких как время и память, необходимых для его выполнения.
Существуют два основных типа сложности алгоритма: временная сложность и пространственная сложность.
Временная сложность алгоритма оценивает время, необходимое для его выполнения, в зависимости от размера входных данных. Обычно время выполнения алгоритма измеряется в тактах процессора или в секундах. Примеры временной сложности включают константную сложность O(1) (выполнение за постоянное время), линейную сложность O(n) (выполнение занимает время, пропорциональное размеру входных данных) и квадратичную сложность O(n^2) (выполнение занимает время, пропорциональное квадрату размера входных данных).
Пространственная сложность алгоритма оценивает объем памяти, необходимый для его выполнения, в зависимости от размера входных данных. Обычно пространственная сложность измеряется в байтах. Примеры пространственной сложности включают константную сложность O(1) (не зависит от размера входных данных), линейную сложность O(n) (потребляет память, пропорционально размеру входных данных) и квадратичную сложность O(n^2) (потребляет память, пропорционально квадрату размера входных данных).
Что означает сложность алгоритма?
Сложность алгоритма представляет собой меру его эффективности и определяет количество ресурсов, таких как время и память, необходимых для его выполнения.
Существуют два основных типа сложности алгоритма: временная сложность и пространственная сложность.
Временная сложность алгоритма оценивает время, необходимое для его выполнения, в зависимости от размера входных данных. Обычно время выполнения алгоритма измеряется в тактах процессора или в секундах. Примеры временной сложности включают константную сложность O(1) (выполнение за постоянное время), линейную сложность O(n) (выполнение занимает время, пропорциональное размеру входных данных) и квадратичную сложность O(n^2) (выполнение занимает время, пропорциональное квадрату размера входных данных).
Пространственная сложность алгоритма оценивает объем памяти, необходимый для его выполнения, в зависимости от размера входных данных. Обычно пространственная сложность измеряется в байтах. Примеры пространственной сложности включают константную сложность O(1) (не зависит от размера входных данных), линейную сложность O(n) (потребляет память, пропорционально размеру входных данных) и квадратичную сложность O(n^2) (потребляет память, пропорционально квадрату размера входных данных).
Сложность алгоритма представляет собой меру его эффективности и определяет количество ресурсов, таких как время и память, необходимых для его выполнения.
Существуют два основных типа сложности алгоритма: временная сложность и пространственная сложность.
Временная сложность алгоритма оценивает время, необходимое для его выполнения, в зависимости от размера входных данных. Обычно время выполнения алгоритма измеряется в тактах процессора или в секундах. Примеры временной сложности включают константную сложность O(1) (выполнение за постоянное время), линейную сложность O(n) (выполнение занимает время, пропорциональное размеру входных данных) и квадратичную сложность O(n^2) (выполнение занимает время, пропорциональное квадрату размера входных данных).
Пространственная сложность алгоритма оценивает объем памяти, необходимый для его выполнения, в зависимости от размера входных данных. Обычно пространственная сложность измеряется в байтах. Примеры пространственной сложности включают константную сложность O(1) (не зависит от размера входных данных), линейную сложность O(n) (потребляет память, пропорционально размеру входных данных) и квадратичную сложность O(n^2) (потребляет память, пропорционально квадрату размера входных данных).
Что такое идемпотентность?
Идемпотентность — это свойство операции, которое означает, что повторное ее выполнение не приводит к изменению состояния системы после первого выполнения. В контексте веб-разработки и использования HTTP методов, идемпотентность означает, что повторный запрос с одним и тем же набором параметров не изменит состояние сервера.
Это важное понятие для разработчиков, потому что идемпотентные операции обеспечивают безопасность и надежность системы, позволяя повторять запросы в случае, если они не достигли сервера или были обработаны, но клиент не получил ответа.
Вот несколько примеров идемпотентных операций:
1. Чтение данных: Операция получения данных из базы данных с помощью SELECT является идемпотентной, потому что повторное выполнение запроса не изменит состояние базы данных.
2. Удаление записи: Операция DELETE является идемпотентной, поскольку повторное выполнение запроса на удаление записи не приведет к ошибке и не изменит состояние базы данных, так как запись уже удалена.
3. Обновление записи: Если обновление записи происходит на основе идентификатора записи и одинаковые значения обновляются несколько раз, то запрос UPDATE будет идемпотентным.
Идемпотентность — это свойство операции, которое означает, что повторное ее выполнение не приводит к изменению состояния системы после первого выполнения. В контексте веб-разработки и использования HTTP методов, идемпотентность означает, что повторный запрос с одним и тем же набором параметров не изменит состояние сервера.
Это важное понятие для разработчиков, потому что идемпотентные операции обеспечивают безопасность и надежность системы, позволяя повторять запросы в случае, если они не достигли сервера или были обработаны, но клиент не получил ответа.
Вот несколько примеров идемпотентных операций:
1. Чтение данных: Операция получения данных из базы данных с помощью SELECT является идемпотентной, потому что повторное выполнение запроса не изменит состояние базы данных.
2. Удаление записи: Операция DELETE является идемпотентной, поскольку повторное выполнение запроса на удаление записи не приведет к ошибке и не изменит состояние базы данных, так как запись уже удалена.
3. Обновление записи: Если обновление записи происходит на основе идентификатора записи и одинаковые значения обновляются несколько раз, то запрос UPDATE будет идемпотентным.
Как работает lazy loading и можно ли его реализовать в PHP?
Lazy loading (отложенная загрузка) — это паттерн проектирования, при котором инициализация объекта или загрузка ресурса откладывается до момента, когда он действительно потребуется. Это помогает оптимизировать использование памяти и повысить производительность, особенно при работе с тяжёлыми объектами или данными.
⚙️ Как работает lazy loading
Вместо немедленной загрузки всех зависимостей при создании объекта, lazy loading позволяет отложить эту операцию до первого обращения к нужному свойству или методу. Это особенно полезно, когда:
Загрузка ресурсоёмких данных (например, из базы данных) может быть не нужна в каждом случае.
Необходимо сократить время отклика приложения.
Важно снизить потребление памяти, особенно при работе с большим количеством объектов.
🛠️ Реализация lazy loading в PHP
В PHP существует несколько подходов к реализации отложенной загрузки:
1. Ленивая инициализация (Lazy Initialization)
Значение свойства инициализируется только при первом обращении к нему. Это достигается проверкой, и если значение ещё не установлено, оно загружается и сохраняется для последующих обращений.
2. Виртуальный прокси (Virtual Proxy)
Создаётся объект-заместитель с тем же интерфейсом, что и реальный объект. При первом вызове метода прокси инициализирует реальный объект и делегирует ему вызов.
3. Призрачный объект (Ghost Object)
Объект создаётся в частично инициализированном состоянии, содержащем только идентификатор или минимальные данные. Полная инициализация происходит при первом обращении к дополнительным данным.
4. Хранитель значения (Value Holder)
Специальный объект, который управляет загрузкой значения по требованию. При обращении к значению он проверяет, загружено ли оно, и при необходимости выполняет загрузку.
5. Использование магических методов
В PHP можно переопределить магические методы
6. Встроенные механизмы в PHP 8.4
Начиная с PHP 8.4, появились встроенные механизмы для создания ленивых объектов с помощью методов
✅ Преимущества использования lazy loading
Экономия ресурсов: Загрузка данных происходит только при необходимости, что снижает потребление памяти и ресурсов процессора.
Повышение производительности: Сокращается время инициализации объектов и загрузки страницы или приложения.
Улучшение масштабируемости: Приложение может обрабатывать большее количество объектов без значительного увеличения потребления ресурсов.
⚠️ Возможные недостатки
Сложность отладки: Ошибки могут проявляться только при обращении к отложенно загруженным данным, что усложняет их обнаружение.
Проблемы с последовательностью загрузки: В случае взаимных зависимостей между объектами может возникнуть необходимость в дополнительной логике для предотвращения циклических вызовов.
Увеличение количества запросов: При частом обращении к отложенно загружаемым данным может увеличиться количество запросов к базе данных или другим ресурсам.
Таким образом, lazy loading — это эффективный инструмент для оптимизации ресурсов и повышения производительности PHP-приложений, особенно при работе с большими объёмами данных или сложными структурами объектов. Однако его использование требует внимательного подхода к проектированию архитектуры приложения и учёта возможных сложностей.
Lazy loading (отложенная загрузка) — это паттерн проектирования, при котором инициализация объекта или загрузка ресурса откладывается до момента, когда он действительно потребуется. Это помогает оптимизировать использование памяти и повысить производительность, особенно при работе с тяжёлыми объектами или данными.
⚙️ Как работает lazy loading
Вместо немедленной загрузки всех зависимостей при создании объекта, lazy loading позволяет отложить эту операцию до первого обращения к нужному свойству или методу. Это особенно полезно, когда:
Загрузка ресурсоёмких данных (например, из базы данных) может быть не нужна в каждом случае.
Необходимо сократить время отклика приложения.
Важно снизить потребление памяти, особенно при работе с большим количеством объектов.
🛠️ Реализация lazy loading в PHP
В PHP существует несколько подходов к реализации отложенной загрузки:
1. Ленивая инициализация (Lazy Initialization)
Значение свойства инициализируется только при первом обращении к нему. Это достигается проверкой, и если значение ещё не установлено, оно загружается и сохраняется для последующих обращений.
2. Виртуальный прокси (Virtual Proxy)
Создаётся объект-заместитель с тем же интерфейсом, что и реальный объект. При первом вызове метода прокси инициализирует реальный объект и делегирует ему вызов.
3. Призрачный объект (Ghost Object)
Объект создаётся в частично инициализированном состоянии, содержащем только идентификатор или минимальные данные. Полная инициализация происходит при первом обращении к дополнительным данным.
4. Хранитель значения (Value Holder)
Специальный объект, который управляет загрузкой значения по требованию. При обращении к значению он проверяет, загружено ли оно, и при необходимости выполняет загрузку.
5. Использование магических методов
__get() и __isset()В PHP можно переопределить магические методы
__get() и __isset() для отложенной загрузки свойств объекта. При обращении к неинициализированному свойству __get() может выполнить необходимую загрузку и вернуть значение.6. Встроенные механизмы в PHP 8.4
Начиная с PHP 8.4, появились встроенные механизмы для создания ленивых объектов с помощью методов
ReflectionClass::newLazyGhost() и ReflectionClass::newLazyProxy(). Эти методы позволяют создавать объекты, которые инициализируются только при первом обращении к их свойствам или методам.✅ Преимущества использования lazy loading
Экономия ресурсов: Загрузка данных происходит только при необходимости, что снижает потребление памяти и ресурсов процессора.
Повышение производительности: Сокращается время инициализации объектов и загрузки страницы или приложения.
Улучшение масштабируемости: Приложение может обрабатывать большее количество объектов без значительного увеличения потребления ресурсов.
⚠️ Возможные недостатки
Сложность отладки: Ошибки могут проявляться только при обращении к отложенно загруженным данным, что усложняет их обнаружение.
Проблемы с последовательностью загрузки: В случае взаимных зависимостей между объектами может возникнуть необходимость в дополнительной логике для предотвращения циклических вызовов.
Увеличение количества запросов: При частом обращении к отложенно загружаемым данным может увеличиться количество запросов к базе данных или другим ресурсам.
Таким образом, lazy loading — это эффективный инструмент для оптимизации ресурсов и повышения производительности PHP-приложений, особенно при работе с большими объёмами данных или сложными структурами объектов. Однако его использование требует внимательного подхода к проектированию архитектуры приложения и учёта возможных сложностей.
👍2
Что такое антипатерны? Приведите несколько примеров
Антипатерны (англ. antipatterns) — это плохие практики в программировании, дизайне и разработке, которые могут привести к проблемам, сложности в сопровождении кода, и общему ухудшению качества программного продукта.
1. Analytical paralysis
Аналитический паралич — считается классическим организационным антипаттерном. Его суть заключается в чрезмерном анализировании ситуации при планировании, так что решение или действие не предпринимаются, по сути парализуя разработку. Зачастую это случается в тех случаях, когда цель состоит в достижении совершенства и полной завершенности периода анализа. Этот антипаттерн характеризуется хождением по кругу (такой себе замкнутый цикл), пересмотром и созданием детальных моделей, что в свою очередь мешает рабочему процессу.
К примеру, вы пытаетесь предугадать вещи уровня: а что если вдруг пользователь захочет создать список сотрудников на основе четвертых и пятых букв их имени, с включением в список проектов, которым они уделили больше всего рабочих часов между Новым Годом и Восьмым марта за четыре предыдущих года? По сути это переизбыток анализа.
2. Spaghetti code
Спагетти-код — это антипаттерн, описывающий часть кода, которая является плохо структурированной, запутанной и трудной для понимания, содержащей много всяких переходов, каких как: оборачивание исключений, условий, циклов.
3.Magic numbers
Магическое числа — это антипаттерн, который затрагивает разнородные константы и переменные в программе без пояснения их цели, смысла. То есть, как правило нет адекватного имени или на крайний случай, комментария, поясняющего, что и зачем. Также как и спагетти код, является одним из наиболее распространённых антипаттернов.
Человек, который не является автором данного кода, с трудом может или вовсе не может объяснить, что это и как оно работает (да и сам автор со временем не сможет). В итоге при изменении этого числа или его удалении код магически перестает работать вовсе.
Антипатерны (англ. antipatterns) — это плохие практики в программировании, дизайне и разработке, которые могут привести к проблемам, сложности в сопровождении кода, и общему ухудшению качества программного продукта.
1. Analytical paralysis
Аналитический паралич — считается классическим организационным антипаттерном. Его суть заключается в чрезмерном анализировании ситуации при планировании, так что решение или действие не предпринимаются, по сути парализуя разработку. Зачастую это случается в тех случаях, когда цель состоит в достижении совершенства и полной завершенности периода анализа. Этот антипаттерн характеризуется хождением по кругу (такой себе замкнутый цикл), пересмотром и созданием детальных моделей, что в свою очередь мешает рабочему процессу.
К примеру, вы пытаетесь предугадать вещи уровня: а что если вдруг пользователь захочет создать список сотрудников на основе четвертых и пятых букв их имени, с включением в список проектов, которым они уделили больше всего рабочих часов между Новым Годом и Восьмым марта за четыре предыдущих года? По сути это переизбыток анализа.
2. Spaghetti code
Спагетти-код — это антипаттерн, описывающий часть кода, которая является плохо структурированной, запутанной и трудной для понимания, содержащей много всяких переходов, каких как: оборачивание исключений, условий, циклов.
3.Magic numbers
Магическое числа — это антипаттерн, который затрагивает разнородные константы и переменные в программе без пояснения их цели, смысла. То есть, как правило нет адекватного имени или на крайний случай, комментария, поясняющего, что и зачем. Также как и спагетти код, является одним из наиболее распространённых антипаттернов.
Человек, который не является автором данного кода, с трудом может или вовсе не может объяснить, что это и как оно работает (да и сам автор со временем не сможет). В итоге при изменении этого числа или его удалении код магически перестает работать вовсе.
👍2
Как вы используете пагинацию в Laravel?
Laravel предоставляет простой способ постраничной обработки записей базы данных с помощью метода paginate.
В этом примере мы используем метод paginate для получения коллекции пользователей и разбивки результатов на страницы по 10 записей в каждой. Затем мы можем выполнить итерацию по пагинированной коллекции с помощью цикла foreach.
Чтобы отобразить ссылки на пагинацию в представлении, мы можем использовать метод links для пагинационной коллекции.
Laravel предоставляет простой способ постраничной обработки записей базы данных с помощью метода paginate.
В этом примере мы используем метод paginate для получения коллекции пользователей и разбивки результатов на страницы по 10 записей в каждой. Затем мы можем выполнить итерацию по пагинированной коллекции с помощью цикла foreach.
Чтобы отобразить ссылки на пагинацию в представлении, мы можем использовать метод links для пагинационной коллекции.
Опишите три основных типа ошибок в PHP
В PHP ошибки делятся на три основных типа:
1️⃣ Уведомления (Notices)
Уведомления – это самые легкие ошибки. Они говорят о небольших проблемах, которые могут повлиять на работу программы, но обычно не приводят к ее остановке.
Например, уведомление появится, если вы попытаетесь использовать переменную, которой нет, или обратиться к несуществующему элементу массива. Часто с помощью уведомлений можно заметить возможные ошибки или понять, что можно улучшить в коде.
2️⃣ Предупреждения (Warnings)
Предупреждения – это серьезнее обычных уведомлений, но не настолько критично, как фатальные ошибки. Они говорят о возможных проблемах, которые, все же, не останавливают работу программы.
К примеру, предупреждение появится, если вы пытаетесь подключить несуществующий файл или используете старую функцию. Разработчикам стоит обращать на них внимание, потому что они могут указывать на места, которые нужно исправить.
3️⃣ Фатальные ошибки (Fatal Errors)
В PHP серьезнее всего фатальные ошибки. Из-за них скрипт останавливается сразу и не может продолжаться.
Например, фатальная ошибка произойдет, если вызвать функцию, которой нет, превысить лимит памяти или попытаться создать класс с тем же именем, что уже есть. Такие ошибки нужно сразу исправлять, иначе скрипт не сможет нормально работать.
Обработка ошибок
Для обработки ошибок в PHP разработчики могут использовать функции обработки ошибок, такие как
В PHP ошибки делятся на три основных типа:
Уведомления – это самые легкие ошибки. Они говорят о небольших проблемах, которые могут повлиять на работу программы, но обычно не приводят к ее остановке.
Например, уведомление появится, если вы попытаетесь использовать переменную, которой нет, или обратиться к несуществующему элементу массива. Часто с помощью уведомлений можно заметить возможные ошибки или понять, что можно улучшить в коде.
Предупреждения – это серьезнее обычных уведомлений, но не настолько критично, как фатальные ошибки. Они говорят о возможных проблемах, которые, все же, не останавливают работу программы.
К примеру, предупреждение появится, если вы пытаетесь подключить несуществующий файл или используете старую функцию. Разработчикам стоит обращать на них внимание, потому что они могут указывать на места, которые нужно исправить.
В PHP серьезнее всего фатальные ошибки. Из-за них скрипт останавливается сразу и не может продолжаться.
Например, фатальная ошибка произойдет, если вызвать функцию, которой нет, превысить лимит памяти или попытаться создать класс с тем же именем, что уже есть. Такие ошибки нужно сразу исправлять, иначе скрипт не сможет нормально работать.
Обработка ошибок
Для обработки ошибок в PHP разработчики могут использовать функции обработки ошибок, такие как
set_error_handler() для определения пользовательской обработки ошибок, error_reporting() для установки уровня отчетности об ошибках, а также блоки try, catch и finally для обработки исключений в PHP 7 и более поздних версиях.Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2🔥1
Оба подключают файл, но ведут себя по-разному при ошибке.
🔹 include — если файл не найден, выдаёт Warning и скрипт продолжает выполняться.
🔹 require — если файл не найден, выдаёт Fatal Error и скрипт останавливается.
Есть ещё include_once и require_once — они гарантируют, что файл подключится только один раз, даже если вызов стоит несколько раз в коде. Полезно, чтобы не было повторного объявления классов или функций.
Когда что использовать?
require — когда файл критичен (конфиг, классы). include — когда его отсутствие не ломает логику (например, виджет в шаблоне).
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1🔥1
Атрибуты (аннотации) — это новый механизм, который позволяет добавлять метаданные к классам, методам, свойствам и функциям. Это аналог аннотаций в других языках (например, в Java), но с улучшенной интеграцией в сам язык PHP.
💡 Что такое атрибуты?
Атрибуты — это специальные декларации, которые позволяют прикреплять дополнительную информацию к элементам кода. Они выглядят как комментарии, но их можно обрабатывать программно. Например:
#[Route(«/home»)]class HomeController { //...}🛠 Как это работает?
🔹 Синтаксис атрибутов
Атрибуты начинаются с символа
# и квадратных скобок []. Это позволяет избежать путаницы с обычными комментариями. Пример:#[ExampleAttribute(«value»)]class MyClass { //...}🔹 Доступ к атрибутам
Атрибуты могут быть прочитаны через Reflection API, что позволяет вам работать с метаданными программно. Пример:
$reflection = new ReflectionClass(MyClass::class);$attributes = $reflection->getAttributes();
🔹 Использование в фреймворках
Атрибуты идеально подходят для фреймворков, которые требуют метаданных для маршрутизации, валидации и других операций. Например, в Symfony они могут использоваться для описания маршрутов, а в Laravel — для валидации.
✅ Преимущества атрибутов
— Явность: метаданные непосредственно в коде, легко видны.
— Простота использования: код становится более читаемым и лаконичным.
— Гибкость: легко обрабатывать с помощью Reflection и других инструментов.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1👏1
За год мы провели три потока курса по ИИ-агентам, а теперь запускаем масштабное обновление!
В новом, четвёртом потоке мы учли все пожелания студентов, добавили большой блок про
В программе:
— практика с первого занятия:
— оркестрация в
— продвинутый
— контроль экономики агентов: маршрутизация и кеширование запросов;
— развёртывание локальных опенсорс-моделей с соблюдением 152-ФЗ.
В честь старта продаж действует спецпредложение: 3 курса по цене 1 (два дополнительных курса в подарок).
Доступ к материалам для предварительной подготовки откроется сразу после оплаты.
По промокоду
👉 Присоединиться к четвёртому потоку и вывести агентов в прод
В новом, четвёртом потоке мы учли все пожелания студентов, добавили большой блок про
AgentOps и сместили фокус с базовых концепций на суровый инжиниринг. Рассказать про SOLID и особенности PHP 8 на собеседовании легко, а вот сделать автономного агента, который не сливает бюджет проекта на токены — задача со звёздочкой.В программе:
— практика с первого занятия:
Jupyter-ноутбуки с автопроверкой;— оркестрация в
LangGraph: human-in-the-loop и механизм time-travel;— продвинутый
RAG для продакшена и парсинг сложных документов;— контроль экономики агентов: маршрутизация и кеширование запросов;
— развёртывание локальных опенсорс-моделей с соблюдением 152-ФЗ.
В честь старта продаж действует спецпредложение: 3 курса по цене 1 (два дополнительных курса в подарок).
Доступ к материалам для предварительной подготовки откроется сразу после оплаты.
По промокоду
Agent забирайте скидку 10 000 ₽ (89 000 ₽ вместо 99 000 ₽). Успейте занять место до 28 февраля!👉 Присоединиться к четвёртому потоку и вывести агентов в прод
LSB — механизм, который позволяет в статическом контексте ссылаться на реально вызванный класс, а не на тот, в котором написан метод.
Проблема: self:: всегда указывает на класс, где метод определён:
php
class Base {
public static function create() {
return new self(); // всегда вернёт Base!
}
}
class Child extends Base {}
Child::create(); // вернёт Base, а не Child
С static:: PHP смотрит на класс, через который был сделан вызов:
phpclass Base {
public static function create() {
return new static(); // вернёт тот класс, который вызвал
}
}
class Child extends Base {}
Child::create(); // вернёт Child ✅Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤2🔥2🥱2
Проверим, сколько среди нас
🔥 — Senior
👍🏼 — Middle
❤️ — Junior
😁 — Ещё учусь
Please open Telegram to view this post
VIEW IN TELEGRAM
👍36🔥27❤11😁8👾1
Последний шанс: 3 курса по цене 1 и запуск AI-агентов в продакшн
На собеседованиях по
Обновлённая программа делает упор на жёсткий инжиниринг и вывод в прод. Вы научитесь строить ReAct-циклы, работать с
Почему нельзя откладывать:
— масштабная акция «3 курса по цене 1» сгорает уже сегодня;
— промокод
— сразу после оформления открываются материалы для подготовки — начать учиться можно прямо сейчас.
Забронировать место на курсе и забрать бонусы до конца дня
На собеседованиях по
PHP всё чаще проверяют умение работать с внешними ИИ-сервисами. Как обогатить бэкенд мультиагентными системами, контролировать затраты на API и работать по 152-ФЗ?Обновлённая программа делает упор на жёсткий инжиниринг и вывод в прод. Вы научитесь строить ReAct-циклы, работать с
LangGraph и AutoGen, внедрять продвинутый RAG, протоколы MCP и AgentOps. Все ключевые навыки в одном месте: измеримость систем, time-travel дебаггинг, управление браузером, human-in-the-loop и развёртывание в закрытых контурах.Почему нельзя откладывать:
— масштабная акция «3 курса по цене 1» сгорает уже сегодня;
— промокод
Agent на скидку 10 000 рублей действует последние часы;— сразу после оформления открываются материалы для подготовки — начать учиться можно прямо сейчас.
Забронировать место на курсе и забрать бонусы до конца дня
🌚1
PHP использует два механизма управления памятью: счётчик ссылок (refcount) и циклический сборщик мусора (GC).
Каждая переменная хранит zval с refcount — счётчиком, сколько переменных ссылаются на это значение. Когда refcount падает до 0, память освобождается немедленно.
Проблема возникает при цикличных ссылках:
php$a = [];
$a[] = &$a; // $a ссылается сама на себя
unset($a); // refcount стал 1, а не 0 — утечка
После unset refcount не обнуляется, потому что объект ссылается на самого себя. Простой счётчик это не поймает.
Для таких случаев PHP (с версии 5.3) имеет cyclic garbage collector. Он периодически запускается (или при достижении порога ~10 000 потенциальных "мусорных" zval'ов) и обходит граф ссылок, выявляя изолированные циклы.
Управление вручную:
gc_collect_cycles(); // принудительный запуск
gc_disable(); // отключить, если GC мешает производительности
gc_enable();
gc_status(); // статистика
На практике — актуально в долгоживущих процессах (Swoole, RoadRunner, воркеры), где объекты с взаимными ссылками (например, parent/children в дереве) могут постепенно съедать память. Решение — либо weak references (WeakReference::create($obj)), либо явная очистка связей перед unset.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1🔥1
Fiber — примитив для кооперативной многозадачности. Позволяет приостановить выполнение функции в произвольной точке через Fiber::suspend() и возобновить позже, передав значение обратно.
Главное отличие от async/await: Fibers не заражают сигнатуры. В JS как только где-то await — вся цепочка выше должна быть async. В PHP Fiber::suspend() можно вызвать на любой глубине стека, не меняя сигнатуры вызывающих функций.
Второе отличие — Fibers это низкоуровневый примитив, event loop в них не встроен. Сами по себе они не дают параллелизма — это строительный блок, поверх которого ReactPHP, Revolt и Amp строят настоящую неблокирующую конкурентность.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍4🔥3