PHP存储引擎是一种用于存储和管理数据的软件系统,它可以帮助开发人员快速地创建、修改和删除数据库中的数据。它也可以帮助开发人员快速地执行复杂的SQL查询,并且返回准确的结果。
PHP存储引擎有很多不同的选项,其中最常用的是MySQL、PostgreSQL和SQLite。MySQL是一个关系型数据库,它使用SQL语言来存储、修改和删除数据库中的数据。PostgreSQL是一个对象关系映射(ORM)数据库,它使用特定的语法来存储、修改和删除数据库中的对象。而SQLite是一个文件型数据库,它使用特定的语法来存储、修改和删除文件中的数据。
MySQL是最流行的PHP存储引擎之一,因为它能够快速地执行复杂的SQL语句并返回准确的结果。此外,MySQL还具有很好的性能特性:它能够快速地处理大量数据并返回准确的结果。此外,MySQL还具有很好的可扩展性特性:当你想要扩大你的Web应用时,你可以很容易地将MySQL集成到你新Web应用中去。
PostgreSQL也是一个流行而强大的PHP存储引擎之一。PostgreSQL使用ORM语法来存储、保存和删除对象。此外,PostgreSQL也具有很好性能特性——当你想要扩大你Web应用时;PostgreSQL也能快速地处理大量数量并返回准确耗时少于MySQL 的 结 果 。 此 外 ; PostgreSQL 还 具 有 很 好 的 可 扩 展 性 特 性 ; 你 可 以 非 常 轻 松 地 向 你 的 Web 应 用 中 集 成 PostgreSQL 。
最后要说明 SQLite ; SQLite 是一个文件数 据库 ; 具 有 较 高 的 高 性 能 ; 这 使 得 SQLite 非常适合于小型Web应用或者单独使用时测试代码或者作为内部工具使用时测试代码或者作为内部工具使用时测试代码或者作为内部工具使用时测试代码或者作为内部工具使用时测试代码或者作为内部工具使用时测试代码或者作为内部工具使用时测试代码或者作为内
使用类集合接口访问域对象,在域和数据映射层之间进行调解。存储库封装了持久化在数据存储中的一组对象以及对它们执行的操作,从而提供了持久层的更加面向对象的视图。存储库还支持实现域和数据映射层之间的清晰分离和单向依赖的目标。
Post.php
<?php declare(strict_types=1); namespace DesignPatternsMoreRepositoryDomain; class Post { public static function draft(PostId $id, string $title, string $text): Post { return new self( $id, PostStatus::fromString(PostStatus::STATE_DRAFT), $title, $text ); } public static function fromState(array $state): Post { return new self( PostId::fromInt($state["id"]), PostStatus::fromInt($state["statusId"]), $state["title"], $state["text"] ); } private function __construct( private PostId $id, private PostStatus $status, private string $title, private string $text ) { } public function getId(): PostId { return $this->id; } public function getStatus(): PostStatus { return $this->status; } public function getText(): string { return $this->text; } public function getTitle(): string { return $this->title; } }
PostId.php
<?php declare(strict_types=1); namespace DesignPatternsMoreRepositoryDomain; use InvalidArgumentException; class PostId { public static function fromInt(int $id): PostId { self::ensureIsValid($id); return new self($id); } private function __construct(private int $id) { } public function toInt(): int { return $this->id; } private static function ensureIsValid(int $id) { if ($id <= 0) { throw new InvalidArgumentException("Invalid PostId given"); } } }
PostStatus.php
<?php declare(strict_types=1); namespace DesignPatternsMoreRepositoryDomain; use InvalidArgumentException; class PostStatus { public const STATE_DRAFT_ID = 1; public const STATE_PUBLISHED_ID = 2; public const STATE_DRAFT = "draft"; public const STATE_PUBLISHED = "published"; private static array $validStates = [ self::STATE_DRAFT_ID => self::STATE_DRAFT, self::STATE_PUBLISHED_ID => self::STATE_PUBLISHED, ]; public static function fromInt(int $statusId) { self::ensureIsValidId($statusId); return new self($statusId, self::$validStates[$statusId]); } public static function fromString(string $status) { self::ensureIsValidName($status); $state = array_search($status, self::$validStates); if ($state === false) { throw new InvalidArgumentException("Invalid state given!"); } return new self($state, $status); } private function __construct(private int $id, private string $name) { } public function toInt(): int { return $this->id; } public function toString(): string { return $this->name; } private static function ensureIsValidId(int $status) { if (!in_array($status, array_keys(self::$validStates), true)) { throw new InvalidArgumentException("Invalid status id given"); } } private static function ensureIsValidName(string $status) { if (!in_array($status, self::$validStates, true)) { throw new InvalidArgumentException("Invalid status name given"); } } }
PostRepository.php
<?php declare(strict_types=1); namespace DesignPatternsMoreRepository; use OutOfBoundsException; use DesignPatternsMoreRepositoryDomainPost; use DesignPatternsMoreRepositoryDomainPostId; class PostRepository { public function __construct(private Persistence $persistence) { } public function generateId(): PostId { return PostId::fromInt($this->persistence->generateId()); } public function findById(PostId $id): Post { try { $arrayData = $this->persistence->retrieve($id->toInt()); } catch (OutOfBoundsException $e) { throw new OutOfBoundsException(sprintf("Post with id %d does not exist", $id->toInt()), 0, $e); } return Post::fromState($arrayData); } public function save(Post $post) { $this->persistence->persist([ "id" => $post->getId()->toInt(), "statusId" => $post->getStatus()->toInt(), "text" => $post->getText(), "title" => $post->getTitle(), ]); } }
Persistence.php
<?php declare(strict_types=1); namespace DesignPatternsMoreRepository; interface Persistence { public function generateId(): int; public function persist(array $data); public function retrieve(int $id): array; public function delete(int $id); }
InMemoryPersistence.php
<?php declare(strict_types=1); namespace DesignPatternsMoreRepository; use OutOfBoundsException; class InMemoryPersistence implements Persistence { private array $data = []; private int $lastId = 0; public function generateId(): int { $this->lastId++; return $this->lastId; } public function persist(array $data) { $this->data[$this->lastId] = $data; } public function retrieve(int $id): array { if (!isset($this->data[$id])) { throw new OutOfBoundsException(sprintf("No data found for ID %d", $id)); } return $this->data[$id]; } public function delete(int $id) { if (!isset($this->data[$id])) { throw new OutOfBoundsException(sprintf("No data found for ID %d", $id)); } unset($this->data[$id]); } }
Tests/PostRepositoryTest.php
<?php declare(strict_types=1); namespace DesignPatternsMoreRepositoryTests; use OutOfBoundsException; use DesignPatternsMoreRepositoryDomainPostId; use DesignPatternsMoreRepositoryDomainPostStatus; use DesignPatternsMoreRepositoryInMemoryPersistence; use DesignPatternsMoreRepositoryDomainPost; use DesignPatternsMoreRepositoryPostRepository; use PHPUnitFrameworkTestCase; class PostRepositoryTest extends TestCase { private PostRepository $repository; protected function setUp(): void { $this->repository = new PostRepository(new InMemoryPersistence()); } public function testCanGenerateId() { $this->assertEquals(1, $this->repository->generateId()->toInt()); } public function testThrowsExceptionWhenTryingToFindPostWhichDoesNotExist() { $this->expectException(OutOfBoundsException::class); $this->expectExceptionMessage("Post with id 42 does not exist"); $this->repository->findById(PostId::fromInt(42)); } public function testCanPersistPostDraft() { $postId = $this->repository->generateId(); $post = Post::draft($postId, "Repository Pattern", "Design Patterns PHP"); $this->repository->save($post); $this->repository->findById($postId); $this->assertEquals($postId, $this->repository->findById($postId)->getId()); $this->assertEquals(PostStatus::STATE_DRAFT, $post->getStatus()->toString()); } }
什么是 UML?UML是 OMG 在1997年1月提出了创建由对象管理组和 UML1.0 规范草案;UML 是一种为面向对象开发系统的产品进行说明、...
手动测试是一种软件测试过程,需要手动执行测试用例而不是使用自动化工具。测试人员根据最终用户的角度手动执行所有测试用例。它...
测试计划是描述软件测试领域和活动的详细文档。它概述了测试策略,目标,测试计划,所需资源(人力资源,软件和硬件),测试评估和...
设计模式资源 本章列出了设计模式相关的网站、书籍和文章。 设计模式相关的网站 Wiki Page for Design Patterns - 以一种非常通...
数据访问对象模式(Data Access Object Pattern)或 DAO 模式用于把低级的数据访问 API 或操作从高级的业务服务中分离出来。以下...