2014-05-12 120 views
0

我有這個函數可以獲取動態db數據,並且應該將常量和變量從db結果字符串轉換爲它們的匹配值。如果我只是將代碼作爲「直接」代碼運行,而不是作爲函數運行,但是我想使它更通用,所以我試圖將它作爲函數,當它是一個函數時,它只能轉換不變「,而不是變量。這是直接運行正常的代碼。PHP從函數內部訪問未知的外部變量

$text = 'The sky is $color and<br> the grass is GRASS_COLOR'; // Example value taken from the database 

$color = 'blue'; 
define('GRASS_COLOR', 'green'); 

// collect all defined variables and filter them to get only variables of string and numeric type 
$values = array_filter(get_defined_vars(), function($item) { 
    return is_string($item) || is_numeric($item); 
}); 

// append the dollar sign to keys 
$keys = array_map(function($item) { 
    return '$'.$item; 
}, array_keys($values)); 

// create the final array by comining the arrays $keys and $values 
$vars = array_combine($keys, array_values($values)); 

// relpace names of the variables with values 
$text = str_replace(array_keys($vars), array_values($vars), $text); 

// collect all constants and replace user defined constants with values 
$constants = get_defined_constants(true); 
$text = str_replace(array_keys($constants['user']), array_values($constants['user']), $text); 

// we are done 
echo $text; 

我怎樣才能將其轉換爲一個通用的功能,將訪問外未知變量和輸出正確的結果,像在這種情況下:

The sky is blue and 
the grass is green 

編輯 這是函數:

$foo = 'The sky is $color and</br> the grass is GRASS_COLOR'; // place here value from database 

$color = 'blue'; 
define('GRASS_COLOR', 'green'); 

function db_fetch_vars_constants($text) { 

// collect all defined variables and filter them to get only variables of string and numeric type 
$values = array_filter(get_defined_vars(), function($item) { 
    return is_string($item) || is_numeric($item); 
}); 

// append the dollar sign to keys 
$keys = array_map(function($item) { 
    return '$'.$item; 
}, array_keys($values)); 

// create the final array by comining the arrays $keys and $values 
$vars = array_combine($keys, array_values($values)); 

// relpace names of the variables with values 
$text = str_replace(array_keys($vars), array_values($vars), $text); 

// collect all constants and replace user defined constants with values 
$constants = get_defined_constants(true); 
$text = str_replace(array_keys($constants['user']), array_values($constants['user']), $text); 

// we are done 
echo $text; 
} 

db_fetch_vars_constants($foo); 

編輯#2 作爲@deceze建議,我已經改變了以下功能,它的工作原理。

$color = 'blue'; 
define('GRASS_COLOR', 'green'); 
$foo = 'The sky is $color and</br> the grass is GRASS_COLOR'; // place here value from database 

function db_fetch_vars_constants($text) { 

// collect all defined variables and filter them to get only variables of string and numeric type 
//$values = array_filter(get_defined_vars(), function($item) { 
$values = array_filter($GLOBALS, function($item) { 
    return is_string($item) || is_numeric($item); 
}); 

// append the dollar sign to keys 
$keys = array_map(function($item) { 
    return '$'.$item; 
}, array_keys($values)); 

// create the final array by comining the arrays $keys and $values 
$vars = array_combine($keys, array_values($values)); 

// relpace names of the variables with values 
$text = str_replace(array_keys($vars), array_values($vars), $text); 

// collect all constants and replace user defined constants with values 
$constants = get_defined_constants(true); 
$text = str_replace(array_keys($constants['user']), array_values($constants['user']), $text); 

// we are done 
echo $text; 
} 

db_fetch_vars_constants($foo); 
+0

爲什麼這麼複雜?您可以在'$ text'中使用雙引號。變量自動「填充」。你的「功能」在哪裏? – Raptor

+0

不從MySQL數據庫中獲取。看到這裏:http://stackoverflow.com/questions/23596508/output-with-php-the-value-of-a-variable-or-a-pre-defined-constant-from-a-mysql-r由方式,我只是添加了功能 – CreativeMind

+0

不正確。您可以在定義'$ text'之前定義'$ color'。對於您的問題,您可以通過參考/函數參數將變量傳遞到函數中,具體取決於您的使用情況。避免使用Globals。 – Raptor

回答

1

這聽起來很糟糕。存在變量範圍用於將應用程序的各個部分相互分離並隔離,以防止其自身跺腳。你實質上是要求一個平坦的變量名稱空間,並且應用程序中任何位置的任何變量都可以插入到模板文本中。你不應該那樣做。

取而代之,將所有可能的值作爲註定要用於最終用戶演示文稿並將它們作爲數組傳遞給您的文本插值函數。不要讓函數抓取所有可能的變量,但明確地將它應該使用的值傳遞給它。這是一個非常理想的應用程序結構。

想象一下你有一個變量$password,它包含你的祕密數據庫連接證書或其他敏感信息,以及一個字符串'Your password is $password'。你現在無意中將你的祕密輸出給任何人看。哎呀。

+0

我基本上需要訪問$ GLOBAL數組中可用的所有變量,僅此而已。所以我懷疑這是有害的,特別是如果處理得當。任何關於如何實施的建議? – CreativeMind

+0

我懷疑它也是無害的。 ;)那麼,使用'$ GLOBALS'有什麼問題? – deceze

+0

但你如何實現它在我的函數內部工作? – CreativeMind

相關問題