PHP include_once: ithalat işleme yapılandırma dosyaları için yani

5 Cevap php

En aşağıdaki yapıya sahip varsayalım:

index.php
config.inc.php
\ lib
\ lib \ common.php

Veritabanı adı, kullanıcı ve gibi birçok parametre co config.inc.php yapılandırılır. \lib\common.php bulunan bir işlevden, yani onlara erişmek için doğru yolu nedir. Gerçekten orada her fonksiyonun içinde bir include_once("config.inc.php") yapmak zorunda mı?

Bu ise çalışmak için görünmüyor:

  • config.inc.php \lib\common.php orada da dahil olmak üzere daha önce, bir kez bir kez index.php dahildir
  • config.inc.php \lib\common.php ve diğer tüm dosyaları (bu yolu da dahil olmak üzere önce tüm değişkenleri tanımlar eğer ben sadece düzeyinde tüm "merkez" dosyalarında config.inc.php katmak gerekir index.php
  • config.inc.php \lib\common.php en üstünde yer alıp almadığını de çalışır

Çok teşekkürler - Google ile bir çözüm bulmak mümkün değildi!

Solution

Ben dahil config.inc.php kez index.php (Galen tarafından önerilen) ve kullanılan (David tarafından önerilen) küresel. Ben o beklediğiniz gibi her şey çalışıyor, çok teşekkürler!

Bunun için de N3rd, tkx tarafından önerilen sonra ben kesinlikle auto_prepend içine bakacağız!

5 Cevap

Siz sadece yapın:

include_once("..\\config.inc.php");

common.php üstündeki.

Şimdi bir kaç şey var burada - ilk tersbölüler can sıkıcı, ve (hatta windows üzerinde, (eğik çizgilerle için "/ config.inc.php.." Onları alışverişi yapabilir) Eğer dizini config.inc varsa.. php senin yolunu eklemek içinde bulunur, hatta sadece "config.inc.php" yapabilirsiniz.

Config.inc veri çalışması common.php için gerekli ise, en azından son değil, i [(1)] o {bir çağrı neden olacak gibi, bunun yerine require_once() geçiş öneririz } ya da die() durumda dosya bu nedenle ayrıca yürütme durdurma dahil edilmesi başarısız olur.

EDIT: Ah ben Başkalarının söylediklerini nokta vermedi. Bir işlev içinde bir işlevin dışında bildirilmiş değişkenleri kullanmak için, (diğer söylediğim gibi) küresel anahtar sözcüğünü kullanarak işlev kapsam içinde bu değişkenleri "çekme" gerektiğini işlev bildirmek gerekir.

Aşağıdaki örneği inceleyin:

$var = "Hello World";
function changeVar(){
    $var = "Bye World!";
    echo $var . "\n";
}
changeVar();
echo $var;

Yukarıda belirtilen kod çıktısı, DEĞİLDİR:

Bye World!
Bye World!

daha çok:

Bye World!
Hello World

Bu fonksiyonun $ var İÇ DIŞ fonksiyonun tanımlanan $ var farklı kendi değişken olmasından kaynaklanmaktadır. Bu değiştirin:

$var = "Hello World";
function changeVar(){
    global $var;

    $var = "Bye World!";
    echo $var . "\n";
}
changeVar();
echo $var;

Ve şimdi beklenen çıkışı var:

Bye World!
Bye World!

Eğer index.php dosyasında config.inc.php eklerseniz ... sonra dahil tüm dosyalar bunun içinde verileri kullanmak mümkün olacak.

Eğer common.php fonksiyonları varsa config.inc.php içinde verilere erişmek için global anahtar kelime kullanın, ya da sırayla, bağımsız değişkenler olarak veri geçmek gerekecek

U tam olarak yapmak için auto_prepend özelliğini kullanın. Prepended sonra dosya geçerli komut dizin hiyerarşisini arar ve '. Autoinc.php' ile biten dosyaları arar ve alt dizinlerinde olanlar hiyerarşisinde daha dosyalarında tanımlanan şeyler yazabiliyorlar, yani tersten bunları içerir. Bu kez kurmak ve her yerde otomatik olarak çalışır ve tamamen mütevazi olduğunu. Bu oldukça güzel ve evrensel çözüm bulmak.

O konfigürasyonel amaçlar değişkenleri tanımlamak için iyi bir uygulama değil IMHO. Eğer kod içinde bunları yeniden yazabilirsiniz. Iyi sabitleri tanımlar. Bir yarar olarak - küresel kapsamında olan ve "küresel" bir anahtar kelime olmadan her yerden kullanabilirsiniz.

Ben genellikle bu gibi bir kod ile nesnelere döküm dış verileri ayrıştırır (I DOCUMENT_ROOT dışında XML config dosyalarını kullanın) ve ardından bunu sağlayan statik yöntemlerle soyut bir yapılandırma sınıfı, kullanın

$dbalias = Config::get('db');
DB::connect($dbalias);
echo $dbalias->user . '@' . $dbalias->host;

Eğer ekip ile çalışmak ve (SVN gibi) sürüm aracı kullanırken çok yararlıdır. Localhost üzerinde takım çalışmalarında evereyone bir sürüm edilmediğinde yerel config dosyasında ama her şeyi işlemek.

Okumak için ve desteklemek için, bu şekilde iyi olduğunu, emin, ama güvenli ve kod çok rahat değil.