DevelGuru | Заметки программиста
360
المشتركون
-124 ساعات
-17 أيام
-1430 أيام
- المشتركون
- التغطية البريدية
- ER - نسبة المشاركة
جاري تحميل البيانات...
معدل نمو المشترك
جاري تحميل البيانات...
Чем отличается stop от мока ?
Спросят с вероятностью 13%
В ООП и, в частности, в тестировании, существуют разные методы и инструменты для создания поддельных объектов, которые используются для замены реальных зависимостей в тестах. Два из таких методов — это stubs (стабы) и mocks (моки). Они имеют разные цели и используются по-разному.
Stubs (Стабы)
Это простые поддельные объекты, которые возвращают заранее заданные данные, когда их методы вызываются. Они не проверяют, как они были вызваны, а лишь предоставляют фиксированные ответы, необходимые для теста.
Основные характеристики:
✅Цель: Возврат фиксированных значений.
✅Использование: Подставляют зависимости, чтобы изолировать тестируемый код от внешних влияний.
✅Проверка: Не проверяют взаимодействия с тестируемым кодом.
class User
private $database;
public function __construct(Database $database)
$this->database = $database;
public function getUserName($userId)
return $this->database->fetchUserName($userId);
class DatabaseStub
public function fetchUserName($userId)
return 'John Doe';
$databaseStub = new DatabaseStub();
$user = new User($databaseStub);
echo $user->getUserName(1); // Выведет "John Doe"
В этом примере DatabaseStub возвращает фиксированное значение 'John Doe', когда вызывается метод fetchUserName.
Mocks (Моки)
Это поддельные объекты, которые не только возвращают фиксированные данные, но и проверяют, как они были вызваны. Моки позволяют задавать ожидания относительно вызовов их методов и проверяют, что эти ожидания выполнены во время выполнения теста.
Основные характеристики:
✅Цель: Проверка взаимодействий и поведения.
✅Использование: Подменяют зависимости и проверяют, как тестируемый код взаимодействует с ними.
✅Проверка: Проверяют вызовы методов, аргументы вызовов и количество вызовов.
use PHPUnit\Framework\TestCase;
class UserTest extends TestCase
public function testGetUserName()
// Создаем мок объекта Database
$databaseMock = $this->createMock(Database::class);
// Задаем ожидания: метод fetchUserName должен быть вызван с аргументом 1 и вернуть 'John Doe'
$databaseMock->expects($this->once())
->method('fetchUserName')
->with($this->equalTo(1))
->willReturn('John Doe');
$user = new User($databaseMock);
$this->assertEquals('John Doe', $user->getUserName(1));
В этом примере мы используем PHPUnit для создания мока Database. Мы задаем ожидание, что метод fetchUserName будет вызван один раз с аргументом 1 и вернет 'John Doe'.
Основные отличия:
1️⃣Назначение:
✅Стабы: Возвращают заранее заданные данные, изолируя тестируемый код от реальных зависимостей.
✅Моки: Проверяют взаимодействия и поведение тестируемого кода с его зависимостями.
2️⃣Фокус:
✅Стабы: Сфокусированы на данных, которые возвращаются.
✅Моки: Сфокусированы на том, как методы были вызваны, с какими аргументами и сколько раз.
3️⃣Простота:
✅Стабы: Просты в реализации и не проверяют взаимодействия.
✅Моки: Более сложные, так как включают проверки взаимодействий и поведения.
Если объяснить совсем просто: стабы возвращают заранее заданные ответы, а моки проверяют, как именно и сколько раз их методы были вызваны.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти к списку 385 вопросов на PHP разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Photo unavailableShow in Telegram
Новый учебный год уже начался, а значит, самое время подбодрить себя и настроиться на позитивную волну! Как это сделать? Воспользоваться новым чат-ботом Яндекс Образования! Он превращает любимые школьные и студенческие мемы в кастомный стикерпак с вашим фото.
Переходите по ссылке и начинайте творить! Бот будет активен до 30 сентября
Ищешь полезные знания по архитектуре PHP-приложений?
Подключайся к онлайн-конференции Podlodka PHP Crew, которая пройдет с 30 сентября по 4 октября!
Получишь практические кейсы и советы от экспертов с опытом реальных внедрений в крупных проектах.
💡Ключевые спикеры сезона:
🔥 Кирилл Мокевнин, сооснователь Hexlet, научит строить код на базе явного состояния и флагового программирования, от простых регистраций до сложной синхронизации данных.
💡 Валентин Удальцов, opensource-разработчик, объяснит, когда стоит внедрять CQRS и как избежать ненужных сложностей.
💳 Дмитрий Кириллов, CTO 1С-Старт, разберет ошибки в банковских интеграциях и покажет, как проектировать качественные API на PHP.
📊 Алексей Солодкий из BelkaCar покажет, как использовать Prometheus для кастомных метрик и организовать мониторинг PHP-приложений.
Не упусти шанс улучшить свои навыки! Подробности и билеты на сайте: https://podlodka.io/phpcrew
А промокод сообщества php_crew_5_jwg1i1 даёт скидку еще в 500 руб🥳
Что делает final ?
Спросят с вероятностью 13%
Ключевое слово final используется для ограничения наследования и переопределения классов и методов. Оно выполняет две основные функции:
1️⃣Запрет наследования классов.
2️⃣Запрет переопределения методов в классах-наследниках.
Запрет наследования
Когда класс объявлен с использованием final, он не может быть унаследован. Это может быть полезно, когда вы хотите предотвратить дальнейшее расширение класса, чтобы сохранить его поведение неизменным и избежать непредвиденных изменений в наследниках.
<?php
final class BaseClass
public function sayHello()
echo "Hello from BaseClass\n";
// Попытка наследовать финальный класс приведет к ошибке
class ChildClass extends BaseClass // Ошибка: Class ChildClass cannot extend final class BaseClass
public function sayHello()
echo "Hello from ChildClass\n";
?>
Запрет переопределения
Когда метод в классе объявлен с использованием final, этот метод не может быть переопределен в классах-наследниках. Это полезно, когда нужно гарантировать, что конкретный метод будет работать одинаково во всех производных классах.
<?php
class BaseClass
final public function sayHello()
echo "Hello from BaseClass\n";
public function greet()
echo "Greetings from BaseClass\n";
class ChildClass extends BaseClass
// Попытка переопределить финальный метод приведет к ошибке
public function sayHello() // Ошибка: Cannot override final method BaseClass::sayHello()
echo "Hello from ChildClass\n";
// Не финальный метод можно переопределить
public function greet()
echo "Greetings from ChildClass\n";
$child = new ChildClass();
$child->sayHello(); // Ошибка
$child->greet(); // Выведет: Greetings from ChildClass
?>
Зачем это нужно?
1️⃣Сохранение целостности поведения: Использование final позволяет гарантировать, что определенные методы или классы останутся неизменными, независимо от того, какие изменения будут внесены в классы-наследники.
2️⃣Защита важных функциональностей: Ключевые методы, которые не должны изменяться, могут быть защищены с помощью final, чтобы предотвратить потенциальные ошибки или неправильное использование в наследниках.
3️⃣Упрощение понимания кода: Использование final делает код более предсказуемым и понятным для других разработчиков, так как они могут быть уверены, что поведение final методов и классов не будет изменено в наследниках.
Ключевое слово final используется для предотвращения наследования классов и переопределения методов, что помогает сохранить целостность поведения кода и защитить важные функциональности.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти к списку 385 вопросов на PHP разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Чем composer.json от composer.lock отличается ?
Спросят с вероятностью 13%
composer.json и composer.lock — это два важных файла, которые используются при управлении зависимостями в проектах PHP с помощью Composer. Несмотря на то, что оба файла играют ключевую роль в процессе установки и управления зависимостями, они имеют разные функции и содержат различную информацию.
composer.json
Это файл конфигурации, который содержит информацию о проекте и список зависимостей, необходимых для его работы. В этом файле указываются библиотеки и их версии, которые требуется установить для корректной работы проекта. Кроме того, composer.json может содержать метаинформацию о проекте, такую как название, описание, авторы, лицензия и другие параметры.
"name": "myproject",
"description": "A simple project.",
"authors": [
"name": "John Doe",
"email": "[email protected]"
],
"require":
"monolog/monolog": "^2.0",
"guzzlehttp/guzzle": "^7.0"
В этом примере указаны две зависимости: monolog/monolog версии 2.0 и выше, но не выше 3.0, и guzzlehttp/guzzle версии 7.0 и выше, но не выше 8.0.
composer.lock
Это файл, который фиксирует точные версии всех установленных зависимостей, а также их транзитивных зависимостей. Когда вы запускаете команду composer install, Composer проверяет файл composer.lock и устанавливает зависимости в точности так, как они указаны в этом файле. Это гарантирует, что все разработчики проекта и среды развертывания будут использовать одну и ту же версию всех библиотек, что помогает избежать проблем с несовместимостью.
"packages": [
"name": "monolog/monolog",
"version": "2.3.5",
"source":
"type": "git",
"url": "https://github.com/Seldaek/monolog.git",
"reference": "aabbccddeeff00112233445566778899aabbccdd"
,
...
,
"name": "guzzlehttp/guzzle",
"version": "7.3.0",
"source":
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
"reference": "112233445566778899aabbccddeeff0011223344"
,
...
],
...
Этот файл создается автоматически при выполнении команды composer install или composer update и не требует ручного редактирования.
Основные отличия:
1️⃣Назначение:
✅composer.json: Определяет зависимости проекта и содержит метаинформацию о проекте.
✅composer.lock: Фиксирует точные версии установленных зависимостей для обеспечения консистентности между установками.
2️⃣Редактирование:
✅composer.json: Обычно редактируется вручную разработчиками для добавления или удаления зависимостей.
✅composer.lock: Генерируется и обновляется Composer автоматически.
3️⃣Использование команд:
✅composer.json: Используется командами composer install и composer update для определения зависимостей, которые нужно установить или обновить.
✅composer.lock: Используется командой composer install для установки точно тех версий зависимостей, которые зафиксированы в файле.
Если объяснить совсем просто: composer.json говорит, какие библиотеки нужны проекту, а composer.lock фиксирует, какие конкретно версии этих библиотек были установлены, чтобы все пользовались одинаковыми версиями.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти к списку 385 вопросов на PHP разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Что такое внешний ключ ?
Спросят с вероятностью 13%
Внешний ключ (foreign key) — это концепция в реляционных базах данных, которая используется для установления связи между двумя таблицами. Обеспечивает ссылочную целостность данных, гарантируя, что значение в одном столбце (или группе столбцов) соответствует значению в столбце (или группе столбцов) другой таблицы.
Основные характеристики
1️⃣Связь между таблицами: Устанавливает связь между столбцом (или столбцами) одной таблицы и столбцом (или столбцами) другой таблицы.
2️⃣Обеспечение ссылочной целостности: Гарантирует, что значения в столбце внешнего ключа соответствуют значениям в столбце первичного ключа связанной таблицы.
3️⃣Ограничения: Может накладывать ограничения на операции вставки, обновления и удаления данных, чтобы сохранить целостность связей между таблицами.
Рассмотрим пример, в котором есть две таблицы: orders (заказы) и customers (клиенты). В таблице orders есть столбец customer_id, который ссылается на столбец id в таблице customers.
Создание таблиц с внешним ключом
CREATE TABLE customers (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
order_date DATE NOT NULL,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(id)
);
Зачем они нужны?
1️⃣Обеспечение целостности данных: Гарантируют, что каждая запись в таблице со ссылкой (например, orders) соответствует действительной записи в связанной таблице (например, customers).
2️⃣Предотвращение удаления данных: Могут предотвратить удаление записей, на которые ссылаются другие таблицы. Например, нельзя удалить клиента, если у него есть связанные заказы.
3️⃣Автоматическое обновление: Могут обеспечить автоматическое обновление значений в связанных таблицах при изменении значений первичных ключей.
Ограничения и поведение
1️⃣ON DELETE: Определяет поведение при удалении записей в родительской таблице.
✅CASCADE: Автоматически удаляет записи в дочерней таблице, если соответствующая запись удалена в родительской таблице.
✅SET NULL: Устанавливает значение внешнего ключа в NULL, если соответствующая запись удалена в родительской таблице.
✅RESTRICT: Запрещает удаление записи в родительской таблице, если существуют связанные записи в дочерней таблице.
✅NO ACTION: То же самое, что и RESTRICT.
2️⃣ON UPDATE: Определяет поведение при обновлении значений первичных ключей в родительской таблице.
✅CASCADE: Автоматически обновляет значения внешнего ключа в дочерней таблице при изменении значений в родительской таблице.
✅SET NULL: Устанавливает значение внешнего ключа в NULL, если соответствующее значение изменено в родительской таблице.
✅RESTRICT: Запрещает обновление значений в родительской таблице, если существуют связанные записи в дочерней таблице.
✅NO ACTION: То же самое, что и RESTRICT.
Пример
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
order_date DATE NOT NULL,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
Внешний ключ (foreign key) в реляционных базах данных используется для установления связи между двумя таблицами, обеспечивая ссылочную целостность данных. Он гарантирует, что значения в одной таблице соответствуют значениям в другой, и может накладывать ограничения на операции вставки, обновления и удаления данных для сохранения целостности связей.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти к списку 385 вопросов на PHP разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
اختر خطة مختلفة
تسمح خطتك الحالية بتحليلات لما لا يزيد عن 5 قنوات. للحصول على المزيد، يُرجى اختيار خطة مختلفة.