php, bildindik “include” işlemi için bir çok güzel dil komutu barındırır: include, include_once, require, require_once.
yalnız bu komutlarla ilgili bir sorunum var. kendimce bir çözüm ürettim, ve kullanıyorum. daha iyisini bulamayanlar kullanır, daha iyisini bilenler de beni haberdar eder ümidiyle burada yayınlıyorum
sorun şu: diyelim ki şöyle bir dizin/betik yapınız var,
/dir1/a.php
/dir1/b.php
/c.php
a.php, b.php’yi include ediyor.
c.php de, a.php’yi include ediyor.
a.php’yi talep ettiğinizde, b.php aynı dizinde olduğu için sorun yok.
ama c.php’yi talep ettiğinizde, geçerli dizin o an için / olduğundan, a.php içindeki “include b.php” komutu da o dizin içinde b.php arıyor.
asp.net’teki gibi “relative to site root” (~/dir1/b.php) gibi bir çözüm de php’de yok, path’i “/” ile başlatabilirsiniz ama bu da tüm sistem yolunu da bilmenizi gerektiriyor: /www/domainxxx/dir1/b.php.
debug_backtrace() isimli cabbar ve vakur bir metod, o an için çalıştırılan “stack trace”i bir dizi halinde döndürüyor. bu kıyağı, php’nin “interpreted” bir dil olmasına borçluyuz
tabii ki sorunun kendisini de :). neyse, sonuç olarak include ve file_get_contents() fonksiyonlarının yerine şu fonksiyonları kullanmaya başladım:
<?php
/*
Görkem PAÇACI
19 Aralık 2006
Çeşme
*/
function get_caller_script($seed=0)
{
$backtrace = debug_backtrace();
$callerscript = $backtrace[$seed+1]["file"];
return $callerscript;
}
function realpath_safe($filename, $seed=0)
{
$caller_script_path = get_caller_script($seed+1);
return dirname($caller_script_path) . “/” . $filename;
}
function include_safe($filename)
{
return include realpath_safe($filename);
}
function require_once_safe($filename)
{
return require_once realpath_safe($filename);
}
function get_contents_safe($filename)
{
return file_get_contents(realpath_safe($filename));
}
?>



