@zeuss56

Правильно ли я использую ООП?

  • Все классы разложены по папкам согласно неймспейсам (если используются) в папке class. Подгружаются autoloader'ом:
    # константы
    const DS = DIRECTORY_SEPARATOR;
    
    # установка текущей директории
    chdir(__DIR__);
    
    # инициализация автозагрузки
    spl_autoload_register(function($classname) {
      $filepath = 'class'.DS.str_replace('\\', DS, $classname).'.php';
      return file_exists($filepath) ? include_once($filepath) : false;
    });

  • Сначала создаём интерфейс, затем имплементируем его (не всегда нужно).
  • Если есть переменная, с которой нужно долго работать, как ссылка на БД или на файл, делаем для неё приватную переменную и сеттер (часто роль сеттера выполняет конструктор):
    private $db;
    
    function __construct(DB $db) {
      # установка класса БД
      $this->db = $db;
    }

  • Естественно, повторяющийся код выносим в отдельные методы. Если есть похожие методы в разных классах, выносим их в отдельный класс и используем или наследуем этот класс, смотря насколько общий функционал.

  • Константы определяются вне классов. Константы классов лишь ссылаются на уже определенные снаружи:
    const LOCALES_TABLE = 'com_locales';
    
    class Locale {
      private $localestable = LOCALES_TABLE;
      # ...
    }

  • Использую serialize()/unserialize() для хранения массивов в константах. Кажется, в PHP7 это уже не нужно, но не помню. Хоть это к ООП не относится, но интересно:
    const ABS_TABLES = serialize([
      'com_abs_str',
      'com_abs_int'
    ]);
    
    class ABS_Tables {
      private $tables;
    
      function __construct() {
        $tables = &$this->tables;
        $tables = unserialize(ABS_TABLES);
      }
      # ...
    }

  • В каждом методе используемые переменные линкуются чтобы не писать $this-> при обращении. Насколько это правильно?
    function GetLanguageByID($langid) {
      # линки
      $db         = &$this->db;
      $langstable = &$this->langstable;
      # ...
    }

    UPD (некоторые товарищи не "догоняют"):
    Во многих языках если не нашлось переменной с опеределённым именем определённой в текущем пространстве переменных, она ищется выше. В PHP такого нет. Если я обращаюсь к `$anyvar` из метода класса, то он не найдёт переменную и выкинет нотис. А я хочу обращаться к `$anyvar` класса. Вот и переименовываю `$this->anyvar` в `$anyvar` чтобы меньше писать `$this->` внутри метода. А ссылка - чтобы и чтение и запись в переменную работала.
  • Для проверки корректности ввода я использую такую функцию чтобы не проверять вручную:
    private function CheckArgs(array $inputs) {
      foreach ($inputs as $input)
        if ($input === [] || $input === '' || $input === null)
          return false;
        return true;
    }
    
    function InsertValues($table, array $keys, array $values_arr) {
      # проверка всех аргументов
      if (!$this->CheckArgs(func_get_args()))
        return;
      # ...
    }
    
    function SelectValues($table, array $wherekeys = [], array $wherevalues = []) {
      # проверка определенных аргументов
      if (!$this->CheckArgs([$table]))
        return;
      # ...
    }

  • Вопрос задан
  • 567 просмотров
Решения вопроса 1
@karminski
Senior React.JS Developer
Ну как вам сказать ... На мой взгляд вы бы лучше взяли современный PHP-фрейворк и стали с ними работать, так вы быстрее разберетесь в ООП. Т.к. фрейворк написан достаточно умелыми людьми (например, Yii2, Laravel и т.п.).

Вы не озвучили цель вашего кода? Чего вы хотите добиться? Просто разобраться в ООП?

Теперь по пунктам, что сразу бросилось в глаза. Вы наверно не слышали про паттерны проектирования. Почитайте про них - это тот самый бест-практисес в ООП.

Если есть переменная, с которой нужно долго работать, как ссылка на БД

Вот тут очень хочется применить паттерн Singleton.

В каждом методе используемые переменные линкуются - просто устал постоянно писать $this->

Если я не ошибаюсь определение каждой переменной - это выделение свободной памяти. Так что ваш подход сомнителен. От "усталости" поможет хороший принцип KISS (Keep It Simple Stupid) - сделайте каждый метод или функцию очень маленькой, компактной, выполняющей только одну единственную задачу.

Использую serialize()/unserialize() для хранения массивов в константах

Ой, а поделитесь, для чего вы это делаете?

Как то так. Можете пинать.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
24 апр. 2024, в 19:51
1000 руб./за проект
24 апр. 2024, в 19:40
5000 руб./за проект
24 апр. 2024, в 19:18
50000 руб./за проект