PHP en iyi uygulamalar: config dosyasından geri gitmek değişkenleri işlevlerini çağırarak veya global kullanabilir?

7 Cevap php

Ben birkaç sitelerde kullandığınız bir program var. Bu ('config.php') gerektiren kullanır; mysql vb bilgileri, yolları, bağlamak gibi herhangi bir site bağımlı değişkenleri ayarlamak için

Diyelim ki $backup_path gibi bir işlevle bu site bağımlı değişkenlerin birini kullanın diyelim.

Bu değişken declared in config.php başlangıçta, ve ana program dosyasında görünmüyor.

Ben fonksiyonu bu değişkene erişmeye gerek makebackup($table_name); (ayrıca ayrı bir functions.php dosyasına).

Bunu söylemek için daha iyi mi

makebackup('my_table');

ve sonra kullanarak işlevini çağırmak için "global $ backup_path" inside işlevini kullanın, ya da daha iyi

makebackup('my_table',$backup_path);

İlk için argüman dağınıklığı olmadan, main program flow simple and easy to understand tutmasıdır.

Saniye argüman not be obvious that the variable $backup_path exists bir süre geçtikten sonra, ve hata ayıklama veya elden geçirilmesi zor olabilir olabilir olmasıdır.

Bir ya da bu tekniklerin diğer profesyonel programcılar arasında "standard" mı? Yoksa $_SESSION bu küresel değişkenleri bildirmek için kullanıyor olmalıdır?

7 Cevap

Eğer işlevi için varsayılan bir değer unutmayın:

function makebackup($table, $dir = CONFIG_BACKUP_PATH)

Eğer varsayılan durumda değişken tedarik zorunda kalmazsınız Bu şekilde, sadece yapılandırılmış yedekleme yolu varsayılan olduğunu varsayabiliriz.

Bu sabitleri değil, küresel değişkenler kullandığınızı varsayar.

İkinci alternatif,

makebackup('my_table', $backup_path);

yeniden kullanılabilir bir fonksiyonu ve bu nedenle genellikle tercih edilir. Ekstra argümanı tekrar kullanılabilirliği için büyük bir fiyat değil.

Eğer hiç sadece belirli bir uygulama bu işlevi kullanmak, ve $ backup_path sadece, sonra belki küresel bir alternatif düşünün edeceğiz tamamen eminseniz. O zaman bile, küresel değişken aslında var olduğunu kontrol etmek için iyi. Ve siz onları kullanmaya başladıktan sonra bu globalsin kurtulmak için son derece zor olduğunu unutmayın.

Ben bu amaçlar için Factory sınıfı config Singleton kullanmanız gerekir düşünüyorum.

function makebackup($table)
{
   $backup_path = ConfigFactory().getConfig($some_site_specific_data).getBackupPath()
   mysqldump($table, $backup_path)
}

Başvuruları geçen etrafında (sen alay yapılandırma nesneleri verebilirsiniz) test etmek çok kolaydır. Az çok Globals. Sen referans yöntemine null olmadığını iddia edebilirsiniz. Ben testability iyi uygulama çağırır.

Label that global variable

Şahsen, ben de very açıkça küresel değişkenleri işaretleme almış. I must bunları kullanırsanız, ben onlar hakkında açık olmak istiyorum.

Yani burada, ben $backup_path $GLOBAL_backup_path yeniden adlandırmak istiyorum. Ben gördüm, her zaman, ben onunla dikkatli olmak bilirdim.

Alternatif bir seçenek) (define ile php sabitleri kullanıyor.

Config.php her parametre (mysql bağlantısı, css stil, wathever) için sabitleri koyacaktır. Sonra işlevlerine değişkenler geçmek ne de küresel kullanarak gerekmez.

Tek dezavantajı sadece booleans, yüzen, dizeleri veya tamsayılar, hiçbir karmaşık veri yapıları tanımlamak olabilir.

Orada bunu yapmak için bir 'doğru' yolu gerçekten, ama başka bir seçenek böyle bir şey olurdu emin:

function makebackup($table, $backup_path = '') {
    if ( $backup_path == '' ) {
        if ( isset($GLOBALS['backup_path']) ) {
            $backup_path = $GLOBALS['backup_path'];
        }
        else {
            die('No backup path provided');
        }
    }
 }

Olabildiğince bu şekilde (test ve ileride kullanmak için) değer geçmek ya da onu geçmek yoksa, o zaman fonksiyon olası bir global değişken için bakacağız.