2010-01-21 28 views
6

Eğer sabitleri ayrı bir isim alanında tanımlayacak olsaydım, şöyle olurdu:PHP'de otomatik yükleme sabitleri?

namespace config\database\mysql; 

const HOST = 'localhost'; 
const USER = 'testusr'; 
const PASSWORD = 'testpwd'; 
const NAME = 'testdb'; 

__autoload'u otomatik olarak içerecek şekilde kullanabilirdim:

function __autoload($className) 
{ 
    echo "Autoload: {$className}\n"; 
    $class_file = str_replace('\\', '/', $className) . ".php"; 
    if(file_exists($class_file)) { 
     include $class_file; 
    } 
} 

echo config\database\mysql\HOST; 

çalışmıyor Xzx31, sınıflar ile olduğu gibi sabit için çağrılmıyor, beni bir Undefined constant hatası ile bırakıyor.

Bir şekilde __autoload sınıfını sabitler için simüle edebilir miyim?

cevap

7

bu (benim sunucuda çalışan) deneyin:

<?php 
namespace config\database\mysql; 

class Mysql 
{ 
    const HOST = 'localhost'; 
    const USER = 'testusr'; 
    const PASSWORD = 'testpwd'; 
    const NAME = 'testdb'; 
} 
?> 

<?php 
function __autoload($className) 
{ 
    echo "Autoload: {$className}\n"; 
    $class_file = str_replace('\\', '/', $className) . ".php"; 
    if(file_exists($class_file)) { 
     include $class_file; 
    } 
} 

echo config\database\mysql\Mysql::HOST; 
?> 

Temelde sabitleri için bir sarıcı olarak görev yapacak bir sınıf oluşturmak gerekir ama yaparak bu yüzden istediğiniz gibi çalışmaya __autoload() izin verir.

+0

Teşekkürler! Bu umut verici görünüyor. Onları kukla sınıflara sarmaktan hoşlanmam, ama işe yaramış gibi görünüyor. – Atli

0

Tanımlanmamış bir sabitin kullanılması bir PHP uyarısı atar.

Uyarıyı yakalamak ve uygun sabitler dosyasına yüklemek için özel bir hata işleyicisi yazabilirsiniz.

+1

Atli'nin sorduğu soru bu değil ... –

+0

Öneriniz için teşekkürler. Ne yazık ki 'Undefiend sabiti' hatası, özel bir işleyicinin yakalayamadığı ölümcül bir hatadır ("E_ERROR"). – Atli

+0

Hmm. Tabii ki bir haberdi, ama ben 5.3 kullanmıyorum. – Mike