Kural
Dinamik değişken adları kullanmaktan
kaçının. Dinamik değişken adları (değişken değişkenler), bakımı
zor kodlara ve beklenmeyen davranışlara yol açabilir. Bunların
kullanımı genellikle bir yazım hatasının sonucudur.
Desteklenen diller: PHPGiriş
PHP'nin değişken değişkenler (variable variables) özelliği, bir değişkenin değerini diğer bir değişkenin adı olarak kullanmanıza olanak tanır: $$ sözdizimi. Akıllıca bir kısayol gibi görünen bu yapı, hangi değişkenlerin var olduğunu veya ne içerdiğini statik olarak belirleyemediğinizde bir hata ayıklama kabusuna dönüşür. Şunu kullanan kodlar: $$userName bir dizi (array) veya nesne özelliği yerine, IDE'lerin otomatik tamamlama sunmasını, statik analiz araçlarının hataları yakalamasını veya geliştiricilerin uygulama genelinde veri akışını takip etmesini imkansız hale getirir.
Neden önemli?
Kod sürdürülebilirliği: Değişken değişkenler, geliştiricilerin güvendiği tüm araçları devre dışı bırakır. IDE'ler değişken adlarını otomatikleştiremez, kullanımlarını bulamaz veya güvenli bir şekilde yeniden düzenleyemez. Statik analiz araçları tanımlanmamış değişkenleri veya tür uyumsuzluklarını algılayamaz. Değişkenlerin nerede tanımlandığını veya okunduğunu kod tabanında arayamadığınız (grep) için hata ayıklama işlemi çalışma zamanı (runtime) incelemesi gerektirir.
Güvenlik etkileri: Değişken değişken adları kullanıcı girdisinden geldiğinde, saldırganlar güvenlik açısından kritik olanlar dahil olmak üzere rastgele değişkenlerin üzerine yazabilir. Kötü amaçlı bir istek parametresi şunu hedefleyebilir: $$_GET['var'] şunun üzerine yazmak için: $isAdmin, $userIdveya oturum (session) değişkenleri. Bu durum, tespiti zor ve istismarı kolay olan değişken enjeksiyonu (variable injection) açıkları yaratır.
Performans etkisi: Değişken değişkenler, PHP'yi derleme zamanı (compile-time) simge çözünürlüğü yerine çalışma zamanı aramaları yapmaya zorlar. Yorumlayıcı, her erişimde değişken adını dinamik olarak değerlendirmek zorunda kalır ve bu da normal değişkenlerle çalışan optimizasyonları engeller. Diziler ve nesneler, daha iyi performans özellikleri ile benzer işlevsellik sağlar.
Kod örnekleri
❌ Kural dışı:
function processFormData($formType) {
$userForm = ['name' => '', 'email' => ''];
$adminForm = ['name' => '', 'email' => '', 'role' => ''];
$formName = $formType . 'Form';
$$formName = array_merge($$formName, $_POST);
if ($$formName['email']) {
sendEmail($$formName['email']);
}
return $$formName;
}
// What variable does this actually use?
processFormData('user');
Neden yanlış: Kod, $userForm veya $adminForm öğesini kullanarak dinamik olarak oluşturur $$formName, hangi değişkenin değiştirildiğini takip etmeyi imkansız hale getirir. Eğer $formType kullanıcı girdisinden geliyorsa, saldırganlar kritik değişkenlerin üzerine yazmak için rastgele değişken adları enjekte edebilir.
✅ Kurallara uygun:
function processFormData(string $formType): array {
$forms = [
'user' => ['name' => '', 'email' => ''],
'admin' => ['name' => '', 'email' => '', 'role' => '']
];
if (!isset($forms[$formType])) {
throw new InvalidArgumentException('Invalid form type');
}
$form = array_merge($forms[$formType], $_POST);
if (!empty($form['email'])) {
sendEmail($form['email']);
}
return $form;
}
// Clear which data structure is being used
processFormData('user');
Neden önemli?: Kod, bilinen anahtarlara (keys) sahip açık bir dizi kullanır; bu da veri akışını bariz hale getirir ve tüm IDE özelliklerini etkinleştirir. Girdi doğrulama enjeksiyon saldırılarını önler ve statik analiz kodun doğru olduğunu doğrulayabilir.
Sonuç
Değişken değişkenleri diziler, nesneler veya daha iyi bir kod yapısıyla değiştirin. Dinamik anahtar erişimine ihtiyacınız olduğunda dizileri, bilinen özelliklere sahip yapılı veriler için nesneleri kullanın ve yinelenen mantığı uygun soyutlamalarla yeniden düzenleyin. Değişken değişkenler neredeyse her zaman, uygun veri yapıları ile daha net bir şekilde çözülebilecek bir tasarım sorununa işaret eder.

