2012-02-01 12 views
5

Szukałem wszędzie i nie mogę znaleźć odpowiedzi w taki czy inny sposób. Czy jest to do przyjęcia (dobra lub zła praktyka) do ponownego użycia lub recyklingu zmiennej? Działa, i użyłem tej metody kilka razy, ale nie wiem, czy powinienem to robić, czy nie. Próbuję uciec od używania metod statycznych i przejść do zastrzyku zależności.Czy można poddawać recyklingowi lub ponownie używać zmiennych?

w tym przykładzie nazwa $ table_name jest ustawiona gdzie indziej.

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()); 
     } 
} 

Aby użyć tego chciałbym użyć go w ten sposób:

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

Czy to akceptowalnym sposobem na kod? Dzięki za pomoc.

+3

Jest to poprawne pod względem technicznym, ale spowoduje wiele zamieszania podczas debugowania. – alecwhardy

+0

Pytanie jest nieco błędne: zmienne są często ponownie używane i "poddawane recyklingowi" (do czego one służą, często używa się zmiennej o wartości większej niż pewnego razu). Bardziej niepokoi Cię nazwa zmiennej. Która właściwie odpowiada na pytanie: nie używaj tej samej nazwy dla różnych rzeczy, jeśli nie chcesz mieć fałszywych przyjaciół. – hakre

Odpowiedz

10

Ponowne użycie zmiennych do różnych celów to błąd konserwacyjny, który może się wydarzyć.

To zła praktyka. Dobrze określona zmienna może zdziałać cuda, pomagając w zrozumieniu kodu.

Ponowne użycie zmiennych jest szczególnie delikatne w słabo napisanych językach dynamicznych, takich jak PHP.

[W przyćmionym przeszłości mam natknąć błędów w kodzie produkcyjnym (odczekać, myślę, że to było moje!), Gdzie ponowne użycie pętli lokalnej vars jak i oraz j prowadzić do błędów ...]

+0

Dzięki. To działa, dlatego przeszłam z nim w przeszłości, ale wydawało mi się, że byłaby to zła praktyka, dlatego pomyślałem, że powinienem zapytać. –

2

Ludzie mają tendencję do ponownego użycia zmiennych „jednorazowe” jak i i j, ale jest to zwykle zła forma do ponownego użycia innych zmiennych lokalnych w innym celu. Prowadzi to do nieporozumień czytelnika na temat tego, gdzie zainicjowano zmienną i czy aktualizacje w jednej części kodu wpłyną na inną część kodu. Mogą również wystąpić złe efekty w pakiecie optymalizacyjnym kompilatora (być może sugerując, że zmienna powinna zostać zapisana, gdy nie jest to konieczne).

2

co kiedy potrzebujesz zadzwonić inną metodą z DbObject?

Wolę dać nazwę zmiennej, co to jest:

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

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

Jeśli podoba Ci się używając nazwy pospolite często przechodzące skryptu (np $i do zliczania iteracji w pętli) nie powinno być żadnych problemów, jeśli zrobić przyzwyczajenie się do wywoływania unset(), gdy skończysz używać zmiennej w konkretnym przypadku.

3

Głównym powodem uniknięcia ponownego użycia zmiennych jest to, że jeśli ponownie wykorzystasz zmienną bez prawidłowego jej ponownego zainicjowania, stara wartość "wycieknie", powodując nieprzewidywalne efekty, a nawet luki w zabezpieczeniach. Na przykład:

$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 

Generalnie, ponowne użycie zmiennych nie uszkodzić wydajność jeśli kompilator używa pojedynczej statyczny formularz przypisania (SSA) jako formę pośrednią podczas optymalizacji (część co SSA nie daje odrębne nazwy do takiego ponownego wykorzystania zmienne). Nie martw się o wydajność - martw się o łatwość konserwacji.

+0

dzięki za odpowiedź, nigdy tak naprawdę nie myślałem o tym w ten sposób. –

+0

Jeśli stara zmienna była referencją, może zdarzyć się jeszcze więcej złych rzeczy –

0

Czasami zmienne mogą powodować konflikt lub można je wymieszać. Tak więc ponownie użyłbym tylko $i i $row, chyba że po zakończeniu będziesz unset() zmienną.

Powiązane problemy