@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() для хранения массивов в константах

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

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

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

Похожие вопросы