回收或重用变量是否可以接受?

时间:2012-02-01 02:34:08

标签: php oop variables methods dependency-injection

我到处寻找,似乎无法以这种或那种方式找到答案。重用或回收变量是否可接受(好的或坏的做法)?它工作,我已经使用过这种方法几次,但我不知道我是否应该这样做。我正试图摆脱使用静态方法,并转向依赖注入。

在此示例中,$ 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();

这是一种可接受的代码方式吗? 谢谢你的帮助。

6 个答案:

答案 0 :(得分:11)

为不同目的重用变量是一个等待发生的维护错误。

这是不好的做法。一个命名良好的变量可以帮助代码理解。

在弱类型动态语言(如PHP)中重用变量尤其脆弱。

[在昏暗的过去,我遇到了生产代码中的错误(等等,我认为这是我的!),其中重用本地循环变量,如i和j导致错误...]

答案 1 :(得分:3)

避免重用变量的主要原因是,如果在没有正确重新初始化的情况下重用变量,旧值将“泄漏”,导致不可预测的影响甚至安全漏洞。例如:

$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的一部分为这些重用变量赋予单独的名称),则重用变量不会损害性能。所以不要担心性能 - 担心可维护性。

答案 2 :(得分:2)

当您需要调用DbObject的其他方法时

我更喜欢给变量名称:

$dbo = new DbObject(new Database(), 'items');
$total_count = $dbo->count_all();

//so you call still do things next
$result = $dbo->get_all();

答案 3 :(得分:1)

人们倾向于重复使用“丢弃”变量,例如 i j ,但是为了不同的目的重用其他局部变量通常是不好的形式。这导致读者对初始化变量的位置以及代码的一部分中的更新是否会影响代码的另一部分感到困惑。编译器的优化套件也可能存在不良影响(可能建议在不需要时保存变量)。

答案 4 :(得分:1)

如果你喜欢经常通过一个脚本使用常用名(例如$i来计算循环中的迭代次数),那么如果你习惯在任何时候调用unset()都应该没有问题完成在特定情况下使用变量。

答案 5 :(得分:0)

有时候变量可能会发生冲突,或者你可能会混淆它们。因此,我只会重复使用$i$row,除非您在完成后unset()变量。