"Ad", sabitler ve birden çok PHP içerir

5 Cevap php

Ben aşağıdaki benzer bazı PHP kodu var:

foreach ($settingsarray as $settingsfile)
{
    include ($settingsfile);
    // do stuff here
}

$ Settingsarray belirli bir klasörden dosya adları bir dizidir.

Sorun tabii ki, yeniden edilemeyen, her $ AyarlarDosyası (aynı isimleri ile) sabitleri tanımlar olmasıdır.

Orada bu durumda meydana gelen hataları önlemek mümkün yöntemler hangileri?

Aklıma iki seçenek değişkenler tüm sabitleri değişen ve PHP ad kullanarak içerir.

Ancak, ben ad kullanma hakkında gitmek nasıl emin değilim, her $ AyarlarDosyası başında beyanname gerektirir? Ad alanlarını kullanmadan sabitler, ariables ve fonksiyonlarını izole edilmesine yönelik bir yöntem var mı?

Ben gerçekten çok isterdim, ne kadar basit bir şey yapmak mümkün değildir:

foreach ($settingsarray as $settingsfile)
{
    {//added braces to indicate where the isolation is
    	include ($settingsfile);
    	// do stuff here
    }//what happens in here does not affect what happens outside of here
}

Ben sadece bu yeni özelliği bir parçasıdır ve tüm $ settingsfiles yükler kod sadece bir parçası olduğunu, dikkat etmelisiniz. Kodun geri kalanı sadece hiç bir seferde bir dosya yükler. Onlara içeride işlevlere erişmek mümkün "küresel" değişkenleri tanımlama hakkında endişelenmenize gerek yok ki ben sabitleri kullanıyorum bir nedeni budur.

5 Cevap

Benim cevabım biraz karmaşık, ancak oldukça güzel sizin için çalışması gerekir. Her birini ayrı ayrı değişen çok hoşlanmıyorsunuz madem ben, bu ayarlar dosyaları bir ton var varsayarak yaşıyorum.

Eğer ad kullanmak mümkün iseniz, ben zaten PHP 5.3RC2 yükseltilmiş ettik kabul edeceğiz. . Bir php dosyasına aşağıdaki kopyalayın ve beğeninize ad alanını değiştirmek:

<?php
namespace myapp\config;

function define($key, $val) {
    Config::set($key, $val);
}

class Config {
    private $vars = array();

    // This class should not be instantiated
    private function __construct() {}

    public function set($key, $val) {
        self::$vars[$key] = $val;
    }

    public function get($key) {
        return isset(self::$vars[$key]) ? self::$vars[$key] : NULL;
    }
}

?>

Kodunuzu bu dahil, ve şimdi her şey iş yapma değişen basit bir konudur

<?php

Sizin ayar dosyaları için

<?php namespace myapp\config;

Eğer onları bir ton varsa, terminal hızlı bir sed '' komutu tek bir hamlede, oldukça güzel hepsi dikkat etmelisiniz.

Ben kodu kullanma konusunda seni kaybettim, burada bir örnek:

<?php
require_once('the_php_file_i_just_gave_you.php');
use \myapp\config\Config;

foreach ($settingsarray as $settingsfile) {
    include ($settingsfile);
    $varname = 'key';
    echo "In this file, '$varname' equals: " . Config::get($varname);
}

?>

İyi şanslar!

Seni doğru anlayarak yaşıyorum Tamam, peki, bu döngü içinde her $settingsfile içinde tanımlanmış ve sonra temelde her döngü sonra onlardan kurtulmak sabitleri ile şeyleri yapmak istiyorum?

Unlike variables, a constant is a value that, once set, cannot be changed or unset during the execution of your script src

Tek seçenek değişkenler define() bildirimleri değiştirmektir.

kolay değil ama file_get_contents ($ AyarlarDosyası) ile php dosyasını okuyabilir ardından sabitleri yeniden ve kod eval.

$settingsstr = file_get_contents($settingsfile);
$settingsstr = preg_replace('/<\?\w*(.*)/', '\\1', $settingsstr);//get rid of the php open tag
$settingsstr = preg_replace('/define\("(\w+)"/', 'define("NAMESPACE_\\1"', $settingsstr);
eval($settingsstr);

Birkaç seçenek var:

Use PHP Namespaces

Şaşırtıcı, PHP aslında namespaces için destek var. Ben yıllardır PHP çalışıyoruz ve bu özellik hiç duymadım çünkü bu bulmak için çok sürpriz oldu. Büyük olasılıkla yeni bir özellik ve yaygın olarak kullanılan değil biridir, bu yüzden bu yöntemi kullanarak değil öneririm

Use Class Constants

Sen sınıfları kullanabilir ve class constants ayarlarınızı yüklemek için. Sınıf sabitleri tanımlayan sınıf yerel, böylece sınıf içinde isim çarpışmalar konusunda endişelenmenize gerek olmayacaktır. Muhtemelen dosyasını dahil daha yapmak gerekir, ancak iç kullanım için sınıf sabitleri tutarak, uygulama sabitler tanımlamak ki () gibi DefineConstants () veya LoadConfiguration gibi, her sınıf bir yöntem diyebiliriz.

Use Functions to Extend the Settings

Başka bir fikir bu ayarları 'genişletmek' için bir ayarlar dizi ve ayrı işlevleri oluşturmaktır. Bu şekilde bir hata neden olmadan daha sonraki fonksiyonlarında herhangi bir yapılandırma aşırı yazabilirsiniz. Eğer sabitler bu koymak istiyorsanız Son olarak, () sabitleri tanımlamak için dizi üzerinde döngü olabilir ve tanımlamak kullanın.

Orada yapmak için çalışıyoruz ne başarmak için birçok yolu vardır, fakat bunlar sadece bir kaç fikir.

A settings file should not contan PHP code. It should be some kind of "standard" format. http://www.php.net/parse_ini_file

  • (Senin foreachta) İlk adımda tüm dosyaları okumak
  • Geçici bir diziye değişkenleri toplayın
  • Bu dizi üzerinde başka bir döngü olarak, sabitleri olarak tanımlayabilirsiniz.

Eğer rutin "sabitleri yeniden tanımlamak" için ihtiyacı hissediyorum o zaman bir şey uygulama tasarımı Amish olduğunu.