PHP: использование классов для хранения нединамических данных вместо базы данных - PullRequest
0 голосов
/ 18 марта 2019

В проекте 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 ]

1 голос
/ 18 марта 2019

Это скорее ответ, основанный на мнениях, поэтому я предложу, что я делаю, когда использую static значения.

Объявите члены класса как static и protected для переменных.

Как и в вашем вопросе 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. Добавляет слой security .
  3. Также поддерживает источник, т.е. никаких изменений не произойдет, если вы не измените код.
  4. Не создает новый экземпляр (new Ratios()) для получения статических значений, и у вас есть этот край памяти.

Сделайте то же самое с class Dividers { }.

1 голос
/ 18 марта 2019

Я не знаю, является ли это наилучшей практикой, но я бы сделал отдельный каталог с именем "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.Это делается главным образом для того, чтобы сделать ваш класс более худым, разделяя константы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...