приемлемо ли перерабатывать или повторно использовать переменные?

Я везде искал, и я не могу найти ответа так или иначе. Является ли приемлемым (хорошая или плохая практика) повторное использование или переработка переменной? Он работает, и я использовал этот метод несколько раз, но я не знаю, должен ли я делать это или нет. Я пытаюсь уйти от использования статических методов и перейти к инъекции зависимостей.

в этом примере $ 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() переменную, когда закончите.