【问题标题】:is it acceptable to recycle or reuse variables?回收或重用变量是否可以接受?
【发布时间】:2012-02-23 18:53:29
【问题描述】:

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

在本例中,$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 oop variables methods dependency-injection


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    [过去,我在重用 ij 等局部循环变量时犯了代码错误...]

    【讨论】:

    • 谢谢。它有效,这就是我过去使用它的原因,但似乎这会被认为是不好的做法,这就是为什么我认为我应该四处询问。
    【解决方案3】:

    当你需要调用DbObject的另一个方法时呢?

    我更喜欢给变量命名:

    $dbo = new DbObject(new Database(), 'items');
    $total_count = $dbo->count_all();
    
    //so you call still do things next
    $result = $dbo->get_all();
    

    【讨论】:

      【解决方案4】:

      如果您喜欢在整个脚本中经常使用常用名称(例如,$i 用于计算循环中的迭代次数),如果您习惯于在使用完之后调用 unset()特定情况下的变量。

      【讨论】:

        【解决方案5】:

        避免重用变量的主要原因是,如果你重用一个变量而没有正确地重新初始化它,旧的值会“泄漏”出来,造成不可预知的影响,甚至是安全漏洞。例如:

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

        【讨论】:

        • 谢谢你的回答,我从来没有这么想过。
        • 如果旧变量是引用,可能会发生更糟糕的事情
        【解决方案6】:

        有时变量可能会发生冲突,或者您可能会将它们混为一谈。所以我只会重用$i$row,除非你在完成后unset() 变量。

        【讨论】:

          猜你喜欢
          • 2014-12-19
          • 2019-11-03
          • 2022-06-15
          • 2017-04-07
          • 2012-01-08
          • 2012-10-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多