PHP:使用类存储非动态数据而不是数据库

时间:2019-03-18 20:13:14

标签: php database design-patterns

在BI项目中,我们具有多种报告程序功能。因此,我们定义了一些类来实现此功能。此类需要许多属性来链接和构建复杂的查询以生成报告。任何其他类都应为这些属性设置特定的值,以从该类获取报告。这些属性的值是非动态的。我不使用数据库存储它们。 以下代码是我正在使用的当前模型:

报表生成器(主类):

class Report

    {
        private $indicator;
        private $ratio;
        private $divider;
        private $criteria;
        private $plantation;
        private $reporter;

        public function reporter($reporter)
        {
            $this->reporter = (new Reporters())->get($reporter);
            return $this;
        }

        public function plantation($plantationId)
        {
            $this->plantation = $plantationId;
            return $this;
        }

        public function ratio($ratio)
        {
            $this->ratio = (new Ratios())->get($ratio);
            return $this;
        }

        public function divider($divider)
        {
            $this->divider = (new Dividers())->get($divider);
            return $this;
        }

        public function criteria($criteria)
        {
            $this->criteria = $criteria;
            return $this;
        }

        public function get()
        {
            return $this->mocker();
        }

    }

除法器类:

class Dividers
{
    public $dividers = [
        'sum' => [
            'name' => 'مجموع',
            'alias' => 'sum',
        ],
        'plantations' => [
            'name' => 'مجموعه انتخابی',
            'alias' => 'plantations',
            'model' => Plantation::class
        ],
        'operation_types' => [
            'name' => 'نوع عملیات',
            'alias' => 'operation_type',
            'model' => OperationType::class
        ],
        'planting_years' => [
            'name' => 'سال زراعی',
            'alias' => 'planting_years',
            'model' => Planting_year::class
        ],
        'crops' => [
            'name' => 'انواع گیاهان',
            'alias' => 'crops',
            'model' => Crop::class
        ],
    ];

    public function get($divider)
    {
        if(!array_key_exists($divider, $this->dividers)){
            return false;
        }
        return $this->dividers[$divider];
    }
}

比率类别:

class Ratios
{
    public $ratios = [
        'SUM' => 'انباشته',
        'KILOGRAM' => 'کیلوگرم',
        'HECTARE' => 'هکتار',
        'RIALPERKILO' => 'ریال به کیلوگرم',
        'MILIONRIALPERTON' => 'میلیون ریال بر تن',

    ];

    public function get($ratio)
    {
        if(!array_key_exists($ratio, $this->ratios)){
            return false;
        }
        return $this->ratios[$ratio];
    }
}

因此,对于使用报表生成器,我将使用此方法:

$report = (new Report())
    ->plantation(352)
    ->divider('sum')
    ->reporter('NetProfit', ['operation_type'=> 364])
    ->criteria([['criteriaType'=> 'human_resources', 'value'=> '256'],['criteriaType'=> 'human_resources', 'value'=> '326']])
    ->ratio('sum')
    ->indicator(324, 523, 632)
    ->get();

我的问题是:存储此数据对象以减少人为错误的最佳模式是什么?

2 个答案:

答案 0 :(得分:1)

我不知道这是否是最佳实践,但是我将创建一个单独的目录,称为“ constants”或“ config”或对您来说似乎很直观的目录,然后在其中添加名为Class_Property.php的文件,这些文件将返回该物业的价值

例如,在您的Ratios类中:

   class Ratios
{
    public $ratios = require('config/Ratios_ratios.php');

    public function get($ratio)
    {
        if(!array_key_exists($ratio, $this->ratios)){
            return false;
        }
        return $this->ratios[$ratio];
    }
}

在config / Ratios_ratios.php中:

<?php

        return [
            'SUM' => 'انباشته',
            'KILOGRAM' => 'کیلوگرم',
            'HECTARE' => 'هکتار',
            'RIALPERKILO' => 'ریال به کیلوگرم',
            'MILIONRIALPERTON' => 'میلیون ریال بر تن',

        ];

    ?>

根据数据的重要性,选择require / require_once / include。这样做主要是为了使您的班级更加苗条,并分隔常量

答案 1 :(得分:1)

这更多是基于意见的答案,因此,我将建议使用static值时的操作。

将类成员声明为staticprotected作为变量。

就像您的问题class Ratios { }是静态课程一样

class Ratios{ 
    protected static $ratios = [...];
    public static function get($ratio)
    {
        if(!array_key_exists($ratio, self::$ratios)){
            return false;
        }
        return self::$ratios[$ratio];
    }
}
//Access the Ratios class with.
$val = Ratios::get($ratio);

这确保

  1. 这些值在您的请求的整个生命周期中都不会改变
  2. 添加一层安全性
  3. 还维护源代码,即,如果您不更改代码,则不会更改。
  4. 不创建用于获取静态值的新实例(new Ratios()),而您拥有该内存边缘。

class Dividers { }执行相同操作。