码迷,mamicode.com
首页 > Web开发 > 详细

PHP设计模式之实体属性值模式(EAV 模式)代码实例大全(35)

时间:2020-09-22 16:29:09      阅读:60      评论:0      收藏:0      [点我收藏+]

标签:const   整理   sse   sprint   att   微服务   yii   swoole   更新   

实体属性值(Entity--attribute--value EAV)模式,可以方便 PHP 实现 EAV 模型。

目的

实体属性值模型(Entity-attribute-value EAV)是一种用数据模型描述实体的属性(属性,参数),可以用来形容他们潜在巨大,但实际上将适用于给定的实体的数量是相对较少。

在数学中,这种模式被称为一个稀疏矩阵 。

EAV 也被称为对象的属性值的模式,垂直的数据库模型和开放式架构。

UML图

技术图片

★官方PHP高级学习交流社群「点击」管理整理了一些资料,BAT等一线大厂进阶知识体系备好(相关学习资料以及笔面试题)以及不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货

代码

  • 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);
    }
}

测试

  • Tests/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);
    }
}

PHP 互联网架构师成长之路*「设计模式」终极指南

PHP 互联网架构师 50K 成长指南+行业问题解决总纲(持续更新)

面试10家公司,收获9个offer,2020年PHP 面试问题

★如果喜欢我的文章,想与更多资深开发者一起交流学习的话,获取更多大厂面试相关技术咨询和指导,欢迎加入我们的群啊,暗号:phpzh

2020年最新PHP进阶教程,全系列!

技术图片

内容不错的话希望大家支持鼓励下点个赞/喜欢,欢迎一起来交流;另外如果有什么问题 建议 想看的内容可以在评论提出

PHP设计模式之实体属性值模式(EAV 模式)代码实例大全(35)

标签:const   整理   sse   sprint   att   微服务   yii   swoole   更新   

原文地址:https://www.cnblogs.com/phpyu/p/13712329.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!