2012-02-01 22 views
5

私はどこにでも見てきました。私は答えを見つけられないようです。変数を再利用またはリサイクルすることは受け入れられますか(良いか悪いか)。それは動作し、私はこの方法を数回使用しましたが、これを行うべきかどうかはわかりません。私は、静的メソッドの使用から離れ、依存性注入に移行しようとしています。変数をリサイクルまたは再利用することは可能ですか?

この例では、$ 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(); 

が、これはコーディングする許容可能な方法は何ですか? ご協力いただきありがとうございます。

+3

これは技術的には正しいですが、デバッグ中に多くの混乱を招くでしょう。 – alecwhardy

+0

質問は多少間違っています:変数はしばしば再利用され、 "リサイクル"されます。一度)。あなたは変数名をもっと心配しています。実際に質問に答えます:あなたが偽の友達を望んでいない場合は、別のものに同じ名前を使用しないでください。 – hakre

答えて

10

さまざまな目的で変数を再利用することは、保守エラーが発生するのを待っています。

悪い習慣です。名前のついた変数は、コードの理解を助けるための不思議を行うことができます。

変数を再利用することは、PHPなどの弱く型付けされた動的言語では特に脆弱です。

[Iは、生産コードにエラーに遭遇している薄暗い過去には(私はそれが私のものだったと思う、待って!)ローカルループの再利用がエラーにiとjの鉛のようvarsの...]

+0

ありがとうございます。それは、私が過去にそれを行った理由ですが、それは悪い習慣とみなされるように思えました。それが、私がおそらく尋ねるべきだと思った理由です。 –

2

人々はIJのような「使い捨て」の変数を再利用する傾向があるが、通常、異なる目的のために他のローカル変数を再利用するために悪い形です。そのため、変数が初期化される場所と、コードの一部での更新がコードの別の部分に影響を与えるかどうかについての読者の混乱が生じます。コンパイラの最適化スイートに悪影響が及ぶ可能性もあります(変数が必要でないときに変数を保存することを推奨します)。

2

何についてDbObjectの別の方法を呼び出す必要がある場合は、

私はそれが何であるか、変数名を与える好む:(ループ内で繰り返しをカウントするために例えば$i

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

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

ます場合は、多くの場合、スクリプトを一般的な名前を出して使って、好きが作る場合、あなたは問題ないはずです特定のケースで変数を使用することが終わったときはいつでも、unset()と呼ぶ習慣があります。

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は、再利用に別の名前を与えてないものの一部を性能に損傷を与えないであろう。例えば変数)。パフォーマンスを心配しないでください。メンテナンス性について心配しないでください。

+0

あなたの答えをありがとう、私は本当にそのように考えたことはありません。 –

+0

古い変数が参照変数だった場合、さらに悪いことが起こる可能性があります –

0

変数が競合したり、それらが混ざり合ったりすることがあります。あなたが完了したときに変数unset()を使わない限り、私は$i$rowを再利用するだけです。

関連する問題