Я везде искал, и я не могу найти ответа так или иначе. Является ли приемлемым (хорошая или плохая практика) повторное использование или переработка переменной? Он работает, и я использовал этот метод несколько раз, но я не знаю, должен ли я делать это или нет. Я пытаюсь уйти от использования статических методов и перейти к инъекции зависимостей.
в этом примере $ table_name устанавливается в другом месте.
class DbObject { private $db = NULL; protected $table_name; public function __construct($dbh, $item) { $this->db = $dbh; $this->$table_name = $item; } // counts items in database // public function count_all() { try { $sql = 'SELECT COUNT(*) FROM ' . $this->table_name; $stmt = $this->db->query($sql); $stmt->setFetchMode(pdo::FETCH_COLUMN, 0); $result = $stmt->fetchColumn(); return $result; } catch (PDOException $e) { echo $e->getMessage()); } }
Чтобы использовать это, я бы использовал его следующим образом:
$total_count = new DbObject(new Database(), 'items'); $total_count = $total_count->count_all();
Это приемлемый способ кодирования? Спасибо за вашу помощь.
Повторное использование переменных для разных целей – это ошибка обслуживания, ожидающая своего появления.
Это плохая практика. Хорошо подобранная переменная может творить чудеса для помощи в понимании кода.
Повторное использование переменных особенно хрупко в слабо типизированных динамических языках, таких как PHP.
[В тусклом прошлом я столкнулся с ошибками в производственном коде (подождите, я думаю, что это было мое!), Когда повторное использование локальных циклов цикла, таких как i и j, приводит к ошибкам …]
Основная причина избежать повторного использования переменных заключается в том, что если вы повторно используете переменную без должной повторной инициализации, старое значение будет «просачиваться», вызывая непредсказуемые эффекты и даже уязвимости безопасности. Например:
$foo = $_GET['input']; # use $foo if ($a == $b) { $foo = 1; } else { # $foo = 2; # Commented out for some reason } # Value $foo supplied in URL leaks through to here
Как правило, повторное использование переменных не повредит производительность, если компилятор использует одностатистическую форму назначения (SSA) в качестве промежуточной формы во время оптимизации (часть того, что SSA делает, дает отдельные имена для таких повторно используемых переменных). Поэтому не беспокойтесь о производительности – беспокойтесь о ремонтопригодности.
Люди склонны повторно использовать переменные «отбрасывания», такие как i и j , но обычно это плохая форма для повторного использования других локальных переменных для другой цели. Это приводит к путанице читателя о том, где инициализируется переменная и будут ли обновления в одной части кода влиять на другую часть кода. Также могут возникнуть проблемы с комплектом оптимизации компилятора (возможно, рекомендуется сохранить переменную, если она не нужна).
Как насчет того, когда вам нужно вызвать другой метод DbObject
?
Я предпочитаю, чтобы имя переменной было таким:
$dbo = new DbObject(new Database(), 'items'); $total_count = $dbo->count_all(); //so you call still do things next $result = $dbo->get_all();
Если вам нравится использовать общие имена часто через скрипт (например, $i
для подсчета итераций в цикле), у вас не должно быть проблем, если вы сделаете привычкой вызывать unset()
когда вы закончите использовать переменную в определенном дело.
Иногда переменные могут конфликтовать, или вы можете их смешивать. Поэтому я бы только повторно использовал $i
и $row
если вы не unset()
переменную, когда закончите.