O modo EAV Entidade - atributo - valor pode facilitar a implementação do modelo EAV pelo PHP.
objetivo
Entidade-atributo-valor EAV é um modelo de dados que descreve os atributos (atributos, parâmetros) de entidades. Ele pode ser usado para descrever seu potencial enorme, mas na verdade, o número de entidades que serão aplicadas a uma determinada entidade é relativo Menos.
Em matemática, esse padrão é chamado de matriz esparsa.
EAV também é conhecido como modelo de valor de atributo do objeto, modelo de banco de dados vertical e arquitetura aberta.
Gráficos UML
Código
- Entity.php
<?php
namespace DesignPatterns\More\EAV;
class Entity
{
/**
* @var \SplObjectStorage
*/
private $values;
/**
* @var string
*/
private $name;
/**
* @param string $name
* @param Value[] $values
*/
public function __construct(string $name, $values)
{
$this->values = new \SplObjectStorage();
$this->name = $name;
foreach ($values as $value) {
$this->values->attach($value);
}
}
public function __toString(): string
{
$text = [$this->name];
foreach ($this->values as $value) {
$text[] = (string) $value;
}
return join(', ', $text);
}
}
- Attribute.php
Value.php
<?php
namespace DesignPatterns\More\EAV;
class Attribute
{
/**
* @var \SplObjectStorage
*/
private $values;
/**
* @var string
*/
private $name;
public function __construct(string $name)
{
$this->values = new \SplObjectStorage();
$this->name = $name;
}
public function addValue(Value $value)
{
$this->values->attach($value);
}
/**
* @return \SplObjectStorage
*/
public function getValues(): \SplObjectStorage
{
return $this->values;
}
public function __toString(): string
{
return $this->name;
}
}
- Value.php
<?php
namespace DesignPatterns\More\EAV;
class Value
{
/**
* @var Attribute
*/
private $attribute;
/**
* @var string
*/
private $name;
public function __construct(Attribute $attribute, string $name)
{
$this->name = $name;
$this->attribute = $attribute;
$attribute->addValue($this);
}
public function __toString(): string
{
return sprintf('%s: %s', $this->attribute, $this->name);
}
}
teste
- Testes / EAVTest.php
<?php
namespace DesignPatterns\More\EAV\Tests;
use DesignPatterns\More\EAV\Attribute;
use DesignPatterns\More\EAV\Entity;
use DesignPatterns\More\EAV\Value;
use PHPUnit\Framework\TestCase;
class EAVTest extends TestCase
{
public function testCanAddAttributeToEntity()
{
$colorAttribute = new Attribute('color');
$colorSilver = new Value($colorAttribute, 'silver');
$colorBlack = new Value($colorAttribute, 'black');
$memoryAttribute = new Attribute('memory');
$memory8Gb = new Value($memoryAttribute, '8GB');
$entity = new Entity('MacBook Pro', [$colorSilver, $colorBlack, $memory8Gb]);
$this->assertEquals('MacBook Pro, color: silver, color: black, memory: 8GB', (string) $entity);
}
}
O caminho de crescimento do arquiteto de Internet PHP * O guia definitivo para "padrões de design"
PHP Internet Architect 50K Growth Guide + Industry Problem Solving Guide (Continuous Update)
Entrevista com 10 empresas, obtenha 9 ofertas, perguntas da entrevista PHP em 2020
★ Se você gosta do meu artigo e deseja se comunicar e aprender com desenvolvedores mais experientes, obtenha mais consultoria técnica e orientação relacionada a entrevistas com grandes empresas, bem-vindo ao nosso grupo, senha: phpzh
O último tutorial avançado de PHP em 2020, série completa!
Se o conteúdo for bom, espero que todos apoiem e incentivem a dar um like / like, e sejam bem-vindos a se comunicarem juntos; além disso, se você tiver alguma dúvida, pode sugerir o que deseja ver nos comentários.