Правильно ли я использую ООП? Все классы разложены по папкам согласно неймспейсам (если используются) в папке 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;
# ...
}

21 Авг 2019 в 07:02
193 +1
0
Ответы
1

В общем, вы следуете основным принципам ООП, таким как инкапсуляция, наследование и полиморфизм. Ваши классы разделены по папкам согласно неймспейсам, что делает код более организованным.

Использование интерфейсов, конструкторов, приватных переменных и методов, а также вынос повторяющегося кода в отдельные методы - все это правильные подходы в ООП.

Использование ссылок для упрощения доступа к переменным внутри методов не является плохой практикой, но не всегда необходимо. Это может привести к сложностям при понимании кода другими разработчиками. Поэтому рекомендуется использовать $this-> для явного обращения к переменным объекта.

Использование serialize()/unserialize() для хранения массивов в константах не самый эффективный способ. Вместо этого рекомендуется создать методы или классы для работы с этими данными.

Функция CheckArgs() для проверки корректности ввода также улучшает читаемость и обслуживаемость кода.

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

20 Апр 2024 в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир