Kural
Kaçın dinamik değişken adlarından
Dinamik değişken adları (değişken değişkenler) olabilir yol açabilir
şuna zor sürdürülmesi sürdürülmesi kod ve beklenmedik davranış.
Onların kullanım şöyledir genellikle şu sonuç bir bir yazım hatasından
Desteklenen diller: PHPGiriş
PHP’nin “değişken değişkenler” özelliği, bir değişkenin değerini başka bir değişkenin adı olarak kullanmanıza olanak tanır; bunun için $$ sözdizimi. Akıllı bir kısayol gibi görünen bu yöntem, hangi değişkenlerin mevcut olduğunu veya bunların ne içerdiğini statik olarak belirleyemediğinizde, hata ayıklama açısından bir kabusa dönüşür. Şu şekilde kullanılan kod: $$kullanıcıAdı Bir dizi veya nesne özelliği yerine bunun kullanılması, IDE’lerin otomatik tamamlama özelliği sunmasını, statik analiz araçlarının hataları tespit etmesini veya geliştiricilerin uygulama içindeki veri akışını izlemesini imkânsız hale getirir.
Neden önemli?
Kod bakım kolaylığı: Değişken değişkenler, geliştiricilerin güvendiği tüm araçların işleyişini bozar. IDE’ler, değişken adlarını otomatik olarak tamamlayamaz, kullanım yerlerini bulamaz veya güvenli bir şekilde yeniden yapılandırma yapamaz. Statik analiz araçları, tanımlanmamış değişkenleri veya tip uyuşmazlıklarını tespit edemez. Hata ayıklama için çalışma zamanı incelemesi gerekir; çünkü değişkenlerin nerede ayarlandığını veya okunduğunu bulmak için kod tabanında arama yapamazsınız.
Güvenlikle ilgili hususlar: Değişken isimleri kullanıcı girdisinden geldiğinde, saldırganlar güvenlik açısından kritik olanlar da dahil olmak üzere rastgele değişkenlerin değerlerini değiştirebilirler. Kötü niyetli bir istek parametresi şunları hedef alabilir: $$_GET['var'] üzerine yazmak için $isAdmin, $userId, ya da oturum değişkenleri. Bu durum, tespit edilmesi zor ve istismar edilmesi kolay değişken enjeksiyon güvenlik açıklarına yol açar.
Performans üzerindeki etkisi: Değişken değişkenler, PHP’nin derleme aşamasında sembol çözümlemesi yerine çalışma zamanında arama yapmasını gerektirir. Yorumlayıcı, her erişimde değişken adını dinamik olarak değerlendirmek zorundadır; bu da normal değişkenlerde işe yarayan optimizasyonların uygulanmasını engeller. Diziler ve nesneler, benzer işlevselliği daha iyi performans özellikleriyle sunar.
Kod örnekleri
❌ Uygun değil:
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 değişkenini oluşturur ya da $adminForm dinamik olarak kullanarak $$formName, bu da hangi değişkenin değiştirildiğini tespit etmeyi imkânsız hale getirir. Eğer $formType kullanıcı girdisinden kaynaklandığı için, saldırganlar kritik değişkenlerin değerlerini üzerine yazmak amacıyla rastgele değişken adları enjekte edebilirler.
✅ Uygunluk:
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');
Bunun önemi: Kod, anahtarları bilinen açık bir dizi kullanır; bu sayede veri akışı net bir şekilde anlaşılır ve tüm IDE özelliklerinden yararlanılabilir. Giriş doğrulaması, enjeksiyon saldırılarını önler ve statik analiz, kodun doğru olup olmadığını doğrulayabilir.
Sonuç
Değişken değişkenleri diziler, nesneler veya daha iyi bir kod yapısı ile değiştirin. Dinamik anahtar erişimi gerektiğinde dizileri kullanın, özellikleri bilinen yapılandırılmış veriler için nesneleri kullanın ve tekrarlanan mantığı uygun soyutlamalara dönüştürün. Değişken değişkenler neredeyse her zaman, uygun veri yapılarının daha net bir şekilde çözebileceği bir tasarım sorununa işaret eder.

