О нас
Разработчикам
Заметки
Переводчик
Транслитератор
Сравнить текст
Генератор пароля
Ip и информация
Декодировать JSON
Локация
О нас
Разработчикам
Заметки
Переводчик
Транслитератор
Сравнить текст
Генератор пароля
Ip и информация
Декодировать JSON
Локация
Php и общие понятия
us.content
Какие процессы происходят, когда пользователь вводит в браузере URL? Браузер посылает HTTP запрос к серверу, запрашивая его отправить копию сайта для клиента. Это сообщение и все остальные данные, передаваемые между клиентом и сервером, передаются по интернет-соединению с использованием протокола TCP/IP. Метод HTTP является идемпотентным, если повторный идентичный запрос, сделанный один или несколько раз подряд, имеет один и тот же эффект, не изменяющий состояние сервера. Другими словами, идемпотентный метод не должен иметь никаких побочных эффектов (side-effects), кроме сбора статистики или подобных операций. Методы GET, HEAD, OPTIONS и TRACE определены как безопасные, что также делает их идемпотентными. Стандартный жизненный цикл состоит из следующих пунктов: HTTP запрос через Роуты (Routes) поступает в Контроллер (Controller Контроллер осуществляет некоторые действия в зависимости от запроса и передает данные в Отображения (Views Отображения отображают полученные данные заданным образом, обеспечивая HTTP ответ. Язык Си как ориентир, Zen machine внутри php Система выделяет памяти по 256b memory_limit 128M Установить -1 чтобы использовать всю доступную память Куча - некакая область памяти. Zet val - определяет тип данных. Таблица символов - в ней хранятся имена, далее присваевание значения, т.е. связь. Есть глобальная таблица символов и есть локальные таблицы, например при создании функции, для каждой функции свою таблица символов. unset - удаляет имя в таблице символов и далее удаляется значение из кучи, в 2 этапа. $a = null; Присваевание null - разрыв связи с кучей. Сборщик мусора (гарбич коллектор) - он приходит, когда в таблице символов более 10000 имён, при этом он останавливает скрипт, делает свою работу и далее скрипт продолжает свою работу. Утечка памяти - до версии PHP 5.3 можно наблюдать. Система типов. Используется динамическая система типов. Плюсы: в быстрой разработке и прототипировании. Минусы: наличие ошибок и утяжеление дебаггинга. Рекурсия это функция, которая вызывает саму себя. Reflection API - отражения в PHP, о самом себе. Синтоксический сахар - написать код иначе. Тайп-хинтинг - механизм, который позволяет явно указывать типы параметров. Типизирование - стандартизация функционала классов использую интерфейсы. Инкапсуляция — механизм, позволяющий описывать данные и функции, оперирующие ими, в рамках класса, т.е. спрятать. Dependency Injection, DI-контейнеры - внедрение зависимостей, это когда один объект предоставляет зависимости другому объекту, например в Laravel app()->make(User::class); Сложность алгоритма - это количественная характеристика, которая говорит о том, сколько времени, либо какой объём памяти потребуется для выполнения алгоритма. О n) - обозначается как О большое. Docker — это платформа, которая позволяет упаковать в контейнер приложение со всем окружением и зависимостями, а затем доставить и запустить его в целевой системе. Приложение, упакованное в контейнер, изолируется от операционной системы и других приложений. SSH (от англ. secure shell ― безопасная оболочка) ― это защищённый сетевой протокол для удалённого управления сервером через интернет. Сетевой протокол прикладного уровня, предназначеный для безопасного удаленного доступа к UNIX системам. Данный протокол эффективен тем, что шифрует всю передаваемую информацию по сети. Паттерны (GoF - Банды 4, Порождающие, Структурные, Поведенческие): MVC - Model View Controller - архитектурный паттерн, который разделяет логику от модели и представления, Singleton - антипаттерн, Контейнер свойств, Registry, Interface - может объединяет множество подклассов при едином запуске, Фабрика - класс по созданию нужных нам объектов. Простая фабрика просто генерирует экземпляр для клиента без предоставления какой-либо логики экземпляра. Фабричный метод, Стратегия - позволяет менять выбранный алгорит рассчётов, независимо от объектов, Фасад - простой интерфейс к сложной системе классов, Builder строитель - позволяет по шагово создавать свойства сложного класса, Делегирование - например Request в Laravel делегирует Validate, Адаптер - есть некий интерфейс запуска классов и если новый класс не подходит, то делаем адаптер, Канал событий - участвуют: издатель publisher, канал событий event channel, подписчики subscribers и т.д. Active Record и Data Maper применяются в ORM. Service Layer - шаблон, который инкапсулирует бизнес логику вашего приложения и определяет границу и набор допустимых операций с точки зрения взаимодействующих с ним клиентов. CRUD - Create Read Update Delete LAMP (LNMP) - распределённая архитектура, Linux, Apache (NGINX), MySQL, PHP. Видами архитектуры: Монолит, Модульная, Сервисная, Микросервисная. SOA - сервесно-ориентированная архитектура, делим приложение на микросервисы. Микросервисная архитектура - подход, который помогает не только ускорить разработку продукта, но и сделать ее гибкой и управляемой: проект из неделимого целого превращается в систему связанных между собой блоков — сервисов. Одним из главных принципов явялется "независимость" и "изолированность" сервиса. Общение происходит через API или Брокеры сообщений. SOAP - протокол обмена структурными сообщениями, как xml, json. REST - передача состояния представления. Архитектурный паттерн для построения интерфейсов общения между запросами. Все операции клиента с сервером stateless, т.е. сервер не должен хранить вообще никакой информации о клиенте – никаких сессий. Передача данных в том же виде, что и сами данные. Т.е. мы не заворачиваем данные в XML, как это делает SOAP и XML-RPC и т.д. Просто отдаем сами данные. Каждая единица информации однозначно определяется URL Т.е. например третья книга с книжной полки будет иметь вид /book/3, а 35 страница в этой книге — /book/3/page/35. Для HTTP действие над данными задается с помощью методов: GET (получить), PUT (добавить, заменить), PATCH (добавить, заменяет одно поле), POST (добавить, изменить, удалить), DELETE (удалить). Ответы сервера: 400 Bad Request 401 Unauthorized 403 Forbidden 404 Not Found 500 Internal Server Error 502 Bad Gateway 503 Service Unavailable Mетоды авторизации API API ключ, Basic Auth, HMAC, OAuth 2.0. CI/CD - Непрерывная интеграция (Continuous Integration, CI) и непрерывная поставка (Continuous Delivery, CD) представляют собой культуру, набор принципов и практик, которые позволяют разработчикам чаще и надежнее развертывать изменения программного обеспечения. SPL Стандартная библиотека PHP - это набор интерфейсов и классов, предназначенных для решения стандартных задач. SPL предоставляет ряд стандартных структур данных, итераторов для оббегания объектов, интерфейсов, стандартных исключений, некоторое количество классов для работы с файлами и предоставляет ряд функций, например spl_autoload_register(). Проще говоря, это сервисные классы php, которые предоставляют стандартизированные объекты для работы со структурами данных. Так же описывают стндарт загрузки библиотек. Что позволяет пользоваться сторонними модулями(библиотеками). SOLID: S Single Responsibility Principle (Принцип единственной ответственности) - каждый класс решает одну задачу. O Open-Closed Principle (Принцип открытости-закрытости) - классы открыты для расширения и закрыты для изменения. L Liskov Substitution Principle (Принцип подстановки Барбары Лисков)подклассы могли бы служить заменой для своих суперклассов, т.е. методы были реализованы у наследников, например через интерфейс. I Interface Segregation Principle (Принцип разделения интерфейса) - каждый интерфейс решает одну задачу, чтобы от него не зависили классы. D Dependency Inversion Principle (Принцип инверсии зависимостей) - высокоуровневые компоненты не должны зависить от низкоуровневых. GRASP General Responsibility Assignment Software Patterns (основные шаблоны распределения обязанностей в программном обеспечении) состоит из 9 шаблонов: Creator, Controller, Pure Fabrication, Information Expert, High Cohesion, Indirection, Low Coupling, Polymorphism, Protected Variations. Cтек - используемые ресурсы. Рефакторинг кода. RunTime - стандартное (построчное) выполнение скрипта. Блокировки - проблема блокирощего ПО, чтения файлов, запрос в БД. PHP работает от запроса до ответа, кроме: Event loop - бесконечный цикл событий. React PHP - библиотека. Event loop, SetTimeout, Promise(обещание) и пр. $runTime1 = new \Parallel\RunTime(); $runTime1->($task1); // Многопоточно выполнить задачу Методология согласованная работа команды Agile - подходы к работе, люди и процессы важнее инструментов, работающий продукт важнее документации, прямое общение с заказчиком, изменчивость важнее плана. Scrun - для одного проекта одна команда. Клиент, продакт менеджер, backlog (epic глобальная задача или система c расстановкой приоритетов, story подзадачи epic, task задачи это подзадачи stories). Множество собраний (planning poker) на которых stories разбиваются на task. Оценивают stories в story point и время, задачи по времени, в статусе ToDo, назначаются ответственные, т.е. мы запустили спринт и в конце его должен быть результат. Статусы спринта: Todo, in progress, ready to test, done. Ретроспектива - собрание, что делалось хорошо или плохо в спринте и как сделать лучше. Плюс ежедневные 15 минутные собрания кто что делает. Kanban - работа по backlog по статусам PHP фраймфорки: Laravel, Lumen, Symfony, Yii, CodeIgniter, CakePHP JS фраймфорки: Gatsby, Vue, React, Angular, Node, Next Кэширование - быстрый доступ к данным. Решает проблемы с производительностью веб приложений. Гипервизор - разделяет железо между несколькими системами. Виртуальный маршрутизатор, для связи между виртуальными машинами. OWASP - Open Web Application Security Project открытый проект по обеспечению безопасности приложений, все материалы которого доступны бесплатно на веб-сайте некоммерческой организации OWASP® Foundation. Поставляемые материалы включают документацию, мероприятия, форумы, проекты, инструменты и видео, такие как OWASP Top 10, веб- протоколы OWASP CLASP и OWASP ZAP, а также сканер веб-приложений с открытым исходным кодом. Stateless - Отсутствие состояния. Протокол передачи данных, который относит каждый запрос к независимой транзакции, которая не связана с предыдущим запросом. Mock-объект представляет собой конкретную фиктивную реализацию интерфейса, предназначенную исключительно для тестирования взаимодействия и относительно которого высказывается утверждение. PSR - Стандарт написания PHP кода. Redis, Memcached - Хранилище данных в памяти в формате key:value. OPcahce — это расширение для PHP, которое ускоряет работу за счёт кэширования опкодов. OPCache блокирует общую память во время записи. Общая память используется для: Кэширования структуры данных скрипта, включая и кэширование опкодов. Создания буфера общего внутреннего хранилища строк. TDD - Разработка через тестирование. Тест интеграции отличается от модульного теста тем, что он позволяет двум или более программным компонентам работать совместно, также называемый интеграцией. DDD - Domain Driven Design - это подход, который нацелен на изучение предметной области предприятия в целом или каких-то отдельных бизнес-процессов с последующим переводом в код. Хэш-функция, осуществляющая преобразование массива входных данных произвольной длины в выходную битовую строку установленной длины, выполняемое определённым алгоритмом. Преобразование, производимое хеш-функцией, называется хешированием. Copy-on-write - При чтении области данных используется общая копия, в случае изменения данных — создается новая копия. Связанность (coupling) и связность (cohesion) являются одними из основных характеристик качества проектируемой системы (в частности программной системы). Связанность модулей (coupling), часто называемую зацеплением, характеризует степень независимости модулей. При проектировании систем необходимо стремиться, чтобы модули имели минимальную зависимость друг от друга, т.е. были минимально «сцеплены» между собой (отсюда и термин «сцепление» или связанность). Это требование вытекает из одного из основных принципов системного подхода, требующего минимизации информационных потоков между подсистемами. Связность (cohesion) характеризует целостность, «плотность» модуля, т.е. насколько модуль является простым с точки зрения его использования. В идеале модуль должен выполнять одну единственную функцию и иметь минимальное число «ручек управления». Примером модуля имеющего максимальную связность является модуль проверки орфографии. Если связанность является характеристикой системы, то связность характеризует отдельно взятый модуль. Связанность (coupling) и связность (cohesion) используются не только при проектировании программных комплексов, а являются общесистемными характеристиками и применимы при синтезе любых систем. Стоит ли возвращать null из методов? Если нет, то почему и как писать код в таких случаях? Возвращая null, мы фактически создаем для себя лишнюю работу, а для вызывающей стороны — лишние проблемы. Стоит пропустить всего одну проверку null, и приложение «уходит в штопор». <?php // Условие ? да : нет; // Тернарный оператор // https://habr.com/ru/post/280071/ // php7 echo $_SERVER['DOCUMENT_ROOT']; // Узнать абсолютный путь к файлу $user = $u ?? $y ?? null; // Если есть $u, то она, если есть $y, то она или null (сравнение с null) $user = $user ?: null; // $user = $test ? $test : null; $user = $u ?? null; // $user = isset($test) ? $test : null; $user = $user ?? null; $user ?? = null; // php 7.4 // Heredoc $name = 'Test'; echo <<<NAME Меня зовут "{$name}". Я печатаю/ NAME; $transport = array('foot', 'bike', 'car', 'plane'); $mode = current($transport); // $mode = 'foot'; // Взять первый элемент массива $mode = next($transport); // $mode = 'bike'; // Следующий элемент $mode = prev($transport); // $mode = 'foot'; // Предыдущий элемент $mode = end($transport); // $mode = 'plane'; // Последний элемент /* error_reporting(-1); выводит все ошибки (E_ALL) error_reporting(0); не выводит ошибки @ ставлю впереди функции, подавление ошибок phpinfo(); выводит все настройки php header('Content-Type: text/html; charset=utf-8'); или в файле .htaccess прописать AddDefaultCharset utf-8 php_flag default_charset utf-8 #писать если php старее 5,6 header('location: inc.php'); exit; Редирект без выполнения кода страницы header('refresh: 5; url=inc.php'); Редирект через 5 секунд echo не выводит объекты! var_dump выводит объекты print_r выводит объекты $obj instanceof SameClass принадлежит ли объект $obj к классу SameClass isset существует empty проверяет наличие переменной 404 Not Found (не найдено), 304 Not Modified (не изменялось) application/pdf (mime тип pdf файла) header('HTTP/1.0 404 Not Found'); // указание 404 страницы header('Content-Type: application/pdf; charset=utf-8'); header('Content-Disposition: attachment; filename="dowload.pdf"'); readfile('Logo_design.pdf'); exit; // Скачивание файла PDF $a = 'hello'; $$a = 'world'; // Переменные переменных ${'more' . $a}; // Переменные переменных {$fruits}s эти кавычки чтобы добавить букву к переменной "" в них действуют переменные $this - так называть нельзя, есть ещё список не желательных define("PAGE", "new page") константа - неизменная, чтобы вывести просто пишу без ковычек PAGE const PAGE2 = 'new const'; тоже константа, работает не ниже php 5,2, так определяется константа внутри класса и вначале кода <?php $test = 'test'; Можно не закрывать php код <?= $test; ?> короткий вывод переменной test ТИПЫ ДАННЫХ Скалярные типы - int float bool string (Обычный массив называется скалярным или числовым, бывают ещё ассоциативные). Составные типы - array (массивы), object (объекты). Специальные типы - resource (ресурсы), null. boolean логический true false регистро-независимый тип integer (int) целое число, отрицательные тоже, можно записывать без кавычек float дробное число, с плавающей точкой abs(-1) приводит число к положительному string строка, одинарные кавычки (имена переменных не обрабатываются), двойные кавычки (заключаю когда добавляю перенные в строку), обратный слэш \ экранирует спец символы <<<HERE здесь любая строка и перемнные видит — это аналог двойных кавычек heredoc HERE; между ними могу писать что угодно. После него что-то должно быть или закрыть php или пустая строка nowdoc в php с 5.3 одинарные кавычки <<<'HERE' здесь любая строка и перемнные видит — это аналог одинарных кавычек nowdoc, где не работают переменные HERE; NULL отсутствует значение Сравнение значений переменных в РНР и подводные камни https://www.php.net/manual/ru/types.comparisons.php ОПЕРАТОРЫ +, -, *, / Операнды - это цифры, которые прибавляем или другие действия как в математике % деление по модулю(остаток по делению) ** возведение в степень в версии 5.6 раньше использовалась функция echo pow(2,3) два в третий степени = присваивание &$a присваивание по ссылке ++ инкремент +1 -- дескремент -1 префиксный ++1 потом увеличивает на 1 постфикный 1++ вначале увеличивает на 1 . конкатинация, склеевание строк += текущее значение и прибавить .= текущее значение и прибавляем приклеевание Декремент - увеличивает значение переменной на единицу Инкремент - уменьшает значение переменной на единицу При использовании префиксной нотации сначала происходит изменение переменной, а потом — возврат. При использовании постфиксной нотации — наоборот: сначала возврат, а потом изменение переменной. == сравнение === строгое сравнение ! не равенство, инверсия && AND || OR xor это тоже что или, но не оба = - оператор присвоения == - оператор определяет нестрогое сравнение === - оператор строгого сравнение. Эквивалентное сравнение (типы переменных и их значения должны строго совпадать) Ссылки - несколько значений в таблице символов, одно значение в кучи. Объекты всегда передаются по ссылки. Есть три основных операции с использованием ссылок: присвоение по ссылке, передача по ссылке и возврат по ссылке. Управляющие последовательности РАБОТАЮТ В ДВОЙНЫХ КАВЫЧКАХ \n или PHP_EOL новая строка \t табуляция \v вертикальная табуляция someMethod(...$arguments); Splat оператор в определении функции он выполняет "упаковку" параметров, а при вызове - наоборот, "распаковку". Вариативная функция с изменяющимся числом аргументов. WHILE простой цикл FOR for ($i = 1; $i < 11; $i++) { echo $i . "<br>"; } Задать три параметра: начало номерации, условие, завершение счётчика BREAK остановить continue пропустить include 'inc/inc.php' подключаю файл, при ошибке сайт продолжает работу require при ошибке сайт не показывает контент include_once один раз подключается, при ошибке сайт продолжает работу require_once один раз подключается, при ошибке сайт не показывает контент. Его использовать! $i = 11; // Цикл do do { echo "<br>" . $i++ . "<br>"; } while ($i <= 10); $i = 1; // Цикл while while ($i <= 10) { echo "<br>" . $i++ . "<br>"; } // Создание таблицы $i = 1; echo "<table>\n"; while ($i <= 10) { echo "\t<tr>\n"; $n = 1; while ($n <= 5) { echo "\t\t<td>row - $i and col - $n</td>\n"; $n++; } echo "\t</tr>\n"; $i++; } echo "</table>\n"; // Select с 1990 года $year = 1900; echo "<select>/n"; while ($year <= 2017) { echo "\t<option value='$year'>$year</option>/n"; $year++; } echo "</select>"; // Select с 1990 года echo "<select>/n"; for ($year2 = 1900; $year2 <= 2017; $year2++) { echo "\t<option value='$year2'>$year2</option>/n"; } echo "</select>"; // Таблица умножения $row = 1; echo "<table>\n"; while ($row <= 9) { echo "\t<tr>\n"; $col = 1; while ($col <= 9) { echo "\t\t<td>$row * $col = " . $row * $col . "</td>\n"; $col++; } echo "\t</tr>\n"; $row++; } echo "</table>\n"; // Таблица умножения echo "<table>\n"; for ($row = 1; $row <= 9; $row++) { echo "\t<tr>\n"; for ($col = 1; $col <= 9; $col++) { echo "\t\t<td>$row * $col = " . $row * $col . "</td>\n"; } echo "\t</tr>\n"; } echo "</table>\n"; // Вывести из массива название и цену while ($i <= 2) { echo $goods[$i]['title'] . ' - ' . $goods[$i]['price']; echo "<br>"; $i++; } // Вывести все элементы массива, где ключи цифровые и идут по порядку for($i = 0; $i < count($arr); $i++) { echo $arr[$i] . '<br>'; } //foreach выводи содержание массива, создавая новые переменные $arr = ['ivanov', 'petrov', 'sidorov']; foreach ($arr as $key => $value) { echo "Name: $key, Surname: $value <br>"; } ?> <?php foreach ($arr as $key => $value): ?> <!-- Альтернативный синтаксис вывода html для foreach --> "Name: <?php echo $key?>, Surname: <?php echo $value ?> <br> <?php endforeach; ?> <?php // Break остановка цикла for ($i=0; $i < 30; $i++) { echo $i . '<br>'; if ($i == 5) { echo "<h4>Good</h4>"; break; } } // Continue пропускаем элемент цикла 5 и 10 for ($i=0; $i < 30; $i++) { if ($i == 5 || $i == 10) continue; echo $i . "<br>"; } // Continue пропускаем диапозон цикла с 5 до 10 for ($i=0; $i < 30; $i++) { if ($i >= 5 && $i <= 10) continue; echo $i . "<br>"; } // switch $var = 3; switch ($var) { case 1: echo "Var = 1"; break; case 2: echo "Var = 2"; break; case 3: echo "Var = 3"; break; default: echo "no"; } // Альтернативный синтаксис вывода html для if, while, for, foreach, switch $bool = true; $var = test; ?> <?php if($bool): ?> <h2><?php echo "$var"; ?></h2> <?php endif; ?> <?php //ФОРМЫ ОТПРАВКИ if (isset($_POST['send'])) // Распечатать массивы, если существует $_POST { echo '<pre>'; print_r($_POST); echo '</pre>'; } if (!empty($_GET)) // Распечатать массивы, если не пуст $_GET { echo '<pre>'; print_r($_GET); echo '</pre>'; } // в массив попадает name="name" и alue="name" ?> <a href="index.php?name=Петя&test=123&subject=TEST">link</a> // Задать значение GET <form method="post" action="" enctype="multipart/form-data"> <p> <input type="text" name="name"> </p> <p> <textarea name="text"></textarea> </p> <p> <input type="checkbox" name="remember"> </p> <p> <select name="lang[]" multiple=""> <option value="eng">English</option> <option value="ru">Russian</option> <option value="jp">Japan</option> </select> </p> <p> <input type="file" name="file"> </p> <p> <button type="submit" name="send" value="test">Send</button> </p> </form> <hr> <p>Введенное имя: <?php if(!empty($_POST['name'])) echo $_POST['name']; else echo 'форма не отправлена';?></p> <?php //условие ? да : нет ?> <p>Введенный текст: <?php echo !empty($_POST['text']) ? nl2br($_POST['text']) : 'форма не отправлена' ?></p> <p> <?php if(isset($_POST['remember']) && $_POST['remember'] == 'on') echo 'Чекбокс отмечен' ?> </p> <?php if (isset($_POST['send'])) { echo '<pre>'; print_r($_POST); echo '</pre>'; } if (!empty($_FILES)) { echo '<pre>'; print_r($_FILES); echo '</pre>'; move_uploaded_file($_FILES['file']['tmp_name'], 'upload/' . $_FILES['file']['name']); // Перемещаем файл } // ДЛЯ СЕРВЕРА echo $_SERVER['REQUEST_URI']; // Текущая страница echo $_SERVER['HTTP_REFERER']; // Страница, с которой перешли echo $_SERVER['REMOTE_ADDR']; // IP адрес пользователя echo $_SERVER['PHP_SELF']; // Имя файла относительно корня, который сейчас выполняется, к примеру: index.php, хорошо использовать для редиректа к примеру: header("Location: {$_SERVER['PHP_SELF']}"); exit; echo $_SERVER['SERVER_NAME']; // Имя сервера echo $_SERVER['QUERY_STRING']; // Строка GET запросов echo $_SERVER['DOCUMENT_ROOT']; // Директория от корня echo $_SERVER['HTTP_HOST']; // Имя хоста echo $_SERVER['HTTP_USER_AGENT']; // Информация о браузере пользователя Суперглобальные массивы $_REQUEST, $_GET, $_POST // Session СЕССИИ Сессии являются простым способом хранения информации для отдельных пользователей с уникальным идентификатором сессии. Это может использоваться для сохранения состояния между запросами страниц. Идентификаторы сессий обычно отправляются браузеру через сессионный cookie и используются для получения имеющихся данных сессии. Отсутствие идентификатора сессии или сессионного cookie сообщает PHP о том, что необходимо создать новую сессию и сгенерировать новый идентификатор сессии. Создается файл в директории на сервере, который указан в конфигурации php. Переопределить хранение сессий в опции конфигурации session.save_handler. session_start(); unset($_SESSION['name']); // Удалить значение в сессии session_unset(); // Удалить все переменные в сессии session_destroy(); // Удаляет файл сессии session_id(); //узнать id сессии //Cookie КУКИ Небольшой фрагмент данных, отправленный веб-сервером и хранимый на компьютере пользователя. Веб-клиент (обычно веб-браузер) всякий раз при попытке открыть страницу соответствующего сайта пересылает этот фрагмент данных веб- серверу в составе HTTP запроса. setcookie('name', 'value', time() + 3600 * 24 * 30, '/', true, true); // Установка куки (3 - на месяц, 4 - означает https, 5 - делает её не доступной для JS) echo $_COOKIE['name']; // Выводим созданную куку setcookie('name', '', time()-3600, '/'); // Удаляем куку isset($_COOKIE['couter']) ? setcookie(['counter'], ++$_COOKIE['counter'], time()+3600, '/') : setcookie(['counter'], 1, time()+3600, '/'); //КУРЛ $url = 'https://ya.ru'; $c = curl_init($url); $res = curl_exec($c); curl_close($c); echo $res; // Вывести содержимое веб-страницы if ($curl = curl_init()){ $data = [ 'id' => $id, 'key' => $key, 'command' => $command, ]; curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_POST, true); curl_setopt( curl, CURLOPT_POSTFIELDS, http_build_query($data)); curl_exec($curl); curl_close($curl); } // Запрос POST Functions $f = function($x) { return $x * 2; } $f = function() { function($y) { return $y * 2; } } echo $f()(5); Замыкание Замыкания в PHP представляют анонимную функцию, которая может использовать переменные из своего локального окружения. В отличие от обычных анонимных функций замыкания в PHP могут применять выражение use. $x = 'test'; $f = function($y) use ($x) { return $x * $y; } В PHP замыкание может быть использовано только с использованием анонимных функций, в то время как в JavaScript замыкание может быть создано с помощью любой функции. Кроме того, в JavaScript замыкание может быть использовано для создания приватных переменных и методов, что невозможно в PHP. // $args - любое кол-во аргументов или массив function sum(...$args) { array_sum($args); } // Heredoc $name = 'Test'; echo <<<NAME Меня зовут "$name". Я печатаю/ NAME; Генераторы предоставляют лёгкий способ реализации простых итераторов без использования дополнительных ресурсов или сложностей, связанных с реализацией класса, реализующего интерфейс Iterator. function xRange($start, $limit, $step = 1) { if ($start <= $limit) { if ($step <= 0) { throw new LogicException('Шаг должен быть положительным'); } for ($i = $start; $i <= $limit; $i += $step) { yield $i; } } else { if ($step >= 0) { throw new LogicException('Шаг должен быть отрицательным'); } for ($i = $start; $i >= $limit; $i += $step) { yield $i; } } } echo 'Нечётные однозначные числа с помощью range(): '; foreach (range(1, 9, 2) as $number) { echo "$number "; } echo "\n"; echo 'Нечётные однозначные числа с помощью xrange(): '; foreach (xrange(1, 9, 2) as $number) { echo "$number "; } В самом простом варианте оператор "yield" можно рассматривать как оператор "return", за исключением того, что вместо прекращения работы функции, "yield" только приостанавливает её выполнение и возвращает текущее значение, и при следующем вызове функции она возобновит выполнение с места, на котором прервалась. Исключение в PHP может быть выброшено (throw) и поймано (catch). Код может быть заключён в блок try, чтобы облегчить обработку потенциальных исключений. У каждого блока try должен быть как минимум один соответствующий блок catch или finally. Исключения необходимо для информативного оповещения об ошибке приложения. Throwable interface поступают Error и Exception. PHP7 $a <=> $b; // Spaceship меньше или равно или больше echo $user = $_GET['user'] ?? 'guest'; //если get то get, иначе null echo $user = $_GET['user'] ?? $_GET['user2'] ?? 'guest'; //если get['user'] то get['user'], если get['user2'] то get['user2'], иначе null use some\namespase\{ClassA, ClassB, ClassC}; //объединяет файлы с одинаковым пространстовом имён // Висячая запятая допускается в параметрах php7.4 PHP8 Приведение (unset) равносильно присваиванию переменной или вызову значения NULL. Приведение (unset) удалили в PHP 8.0.0. Именованные аргументы function division($x, $y): float { return $x / $y; } echo division(y: 2, x: 10); // Порядок становится неважен Union types Объединенные типы function division(int|float $x, int|float $y): float { return $x / $y; } Mixed тип function test(mixed $a) { echo $a; } // Эквивалент array|bool|callable|int|float|null|object|resource|string Match оператор (выражение) echo match ($color) { 'red' => 'красный', 'yellow' => 'желтый', 'green' => 'зеленый', } // Изменилось сравнение строк и чисел! 'foo' == 0 // true раньше 'foo' == 0 // false сейчас // Null-безопасный оператор if (null !== $session) { if (null !== $session->user { if (null !== $session->user->name) { echo $session->user->name; } } } echo $session?->user?->name; // Можно так написать // Constructor Property Promotion Объявление свойств в конструкторе readme class Person { public string $name; public int $age; public function __construct(string $name, int $age) { $this->name = $name; $this->age = $age; } } // readme не даёт измеить входящие данные, может быть у класса, тогда все св-ва такие или у св-ва class Person { public function __construct( public string $name, public int $age ) {} } // Можно так написать Just-In-Time компиляция - это выполнение кода и его компиляция по принципу «just in time». Соответствующая операция подразумевает компилирование кода не до выполнения программного обеспечения, а тогда, когда это необходимо. // Изменить настройки php.ini ini_set('upload_max_filesize', '20M'); ini_set('post_max_size', '20M'); // 'max_execution_time', 1800 /** * * PHPDoc: * * @return array - Что возвращает (@return void означает, что не возвращает ничего). * * @property int $id - Означает какие свойства есть у объекта и какого типа. * @param - описывает входящие параметры. * @var - используется для документирования обычных переменных. Можно использовать если PhpStorm не видит переменную. * * @example - используется для размещения ссылки на файл или веб-страницу, где показан пример использования кода. * @todo - напомнить себе доделать. * @method (класс) — применяется к классу и служит для описания магических методов, которые обрабатываются магической функцией __call(). * *![Image](https://omegakontur.ru/touch-icon-ipad-retina.png) * * ```php * public function name(User $user): bool * { * return true; * } * ``` */ Виды уязвимостей: - Демонстрация ошибок пользователю - Доступность данных о характеристиках системы пользователю Доступность данных о программном коде пользователю Простые пароли для доступа к административным страницам Возможность задания глобальных переменных - PHP инъекция - PHP инъекция через загрузку файлов - Еmail-инъекция - SQL инъекция - Межсайтовый скриптинг или XSS - Блокирование вывода ошибок - Для этого достаточно в программном коде задать error_reporting(0) или в файле .htaccess добавить строку php_flag error_reporting 0 - Использование сложных паролей для доступа к административным страницам. Для этого достаточно использовать многозначные пароли, не имеющие семантического значения (например, К7O0iV98dq). - Логирование критических действий пользователя. Не обеспечивает защиту напрямую, но позволяет выявить взломщиков и определить уязвимости, которые они использовали. Для этого действия пользователя и переданные им данные, которые касаются критических моментов работы системы, достаточно записывать в обычный текстовый файл. - Закрытие доступа к модулям сайта. Обеспечивает защиту от попыток просмотра их содержимого или выполнения. Для этого достаточно в файле .htaccess настроить доступ к файлам модулей при помощи конструкций FilesMatch и Files. Например, мы закрываем доступ ко всем модулям с расширением php, кроме файла capcha.php: image. - Отключение возможности задания глобальных переменных. Для этого достаточно в настройках сервера задать register_globals = off; или в файле .htaccess добавить строку php_flag register_globals off. Использование ini_set('register_globals',0; проблему не решит так, как переменные задаются до начала выполнения скрипта. - Отключение возможности использования удаленных файлов. Для этого достаточно в настройках сервера задать allow_url_fopen = off;. Это обеспечивает частичную защиту от PHP инъекций, но не полную, так как взломщик может передавать не ссылку на файл с программным кодом, а сам программный код. Для полной защиты от PHP инъекций необходимо дополнительно использовать фильтрацию поступивших данных. Иногда данную меру защиты невозможно использовать из-за особенностей работы проекта (нужно обращаться к удалённым файлам). - Фильтрация поступающих данных. Обеспечивает защиту от большенства уязвимостей. Универсального решения не существует. Желательно использовать проверку по «белому» списку символов в совокупности с проверкой на запрещённые слова. «Белым» называется список разрешенных символов. В этот список не должны входить опасные символы, например, <>. К запрещённым словам можно отнести: script, http, SELECT, UNION, UPDATE, exe, exec, INSERT, tmp, а также html-теги. - Проверка на загрузку файла при помощи HTTP POST. Обеспечивает защиту от PHP инъекций через загрузку файлов. Для обеспечения этого загруженные на сервер файлы необходимо проверять функцией is_uploaded_file() или перемещать функцией move_uploaded_file(). Данный вид защиты можно не использовать, если отключена возможность задания глобальных переменных. - Экранирование символов кавычек данных, передаваемых в базу данных. Обеспечивает защиту от SQL инъекций. Наиболее оптимальным методом является обработка всех поступивших не числовых данных с помощью функции mysql_real_escape_string(). Можно так же использовать автоматическое экранирование, поступающих данных. Для этого достаточно в файле .htaccess добавить строку php_value magic_quotes_gpc on, но этот способ не является надёжным, так как может привести к двойному экранированию. - Преобразование специальных символов в html-сущности перед выводом. Обеспечивает защиту от XSS. Для этого данные, введенные пользователем, которые могут содержать нежелательные html-тэги, при выводе достаточно обработать функцией htmlspecialchars(). Данный вид защиты можно не использовать, если фильтрация поступающих данных отсеивает опасные html-тэги.
Список