變量變量看起來很酷,但我想不出一個實際在生產環境中使用它們的場景。這種情況會是什麼?他們是如何使用的?變量變量的實際用法是什麼?
回答
我的目的是讓新手程序員在不使用複雜類型(數組和對象)等「複雜東西」的情況下動態更改數據。
我從來沒有使用過它們。
認爲它在一個模板系統使用,你使用的是PHP文件,並需要在變量設置:
function fetch_template($file, $vars){
$ret = 'File not loaded.';
if(file_exists(TEMPLATE_PATH.$file)){
//could do this with extract() but I am showing you
foreach($vars as $varName => $value){
${$varName} = $value;
}
ob_start();
include(TEMPLATE_PATH.$file);
$ret = ob_get_contents();
ob_end_clean();
}
return $ret;
}
現在,假設你使用模板,這些變量名,你可以把它和通變量供其使用。
echo fetch_template('hi_there.tpl', array('name'=>'JJ'));
然後在你的模板:
Hello <?php echo $name; ?>!
同樣的事情可以通過['extract']完成(http://ca.php.net/manual/en/function.extract.php) – 2010-08-19 16:20:33
現在你有一個bug'$ vars'有一個鍵'「文件「'。這就是爲什麼變量變量(和「提取」,爲此)是危險的。在模板中使用類似'$ m ['var']'的東西會更難嗎? – Artefacto 2010-08-19 16:23:21
@Daniel:代碼示例明確表示可以使用extract()完成。這是一個例子。 @Artefecto:這不是爲了演示安全而生成的,而是爲了使用變量。我從不主張像$ _GET數組中的任何內容那樣盲目地傳遞變量。 – Jage 2010-08-19 16:31:34
就個人而言,我使用它們相當頻繁。以下類型的所有呼叫使用可變變量:
$foo->$bar = 'test';
$foo->$bar();
$bar();
所以你做一個動態方法/函數調用,您正在使用可變的變量隨時...
一個常見的用途是通過__get
神奇方法訪問受保護的屬性。我見過下面往往:
public function __get($name) {
return isset($this->$name) ? $this->$name : null;
}
其定義是使用可變變量提供只讀訪問受保護的成員...
我從來沒有直接使用$$var
語法(和不要以爲我會永遠)。我已經看到它用於通過名稱global $$name; echo $$name;
訪問全局變量,但同樣的事情可以用$_GLOBALS[$name]
語法來完成,所以這不是一個好用例(更不用說使用全局變量通常被認爲是不好的做法)。
我發現它在單一場景中很有用。我有一個JSON格式的YouTube API的結果,這樣
$obj->media$title => Video title
所以我用它像
$mt = 'media$title';
$obj->$mt ;
所以它的工作對我來說在這裏:)
您可以執行'$ obj - > {'media $ title'}'。 – Artefacto 2010-08-19 17:19:58
變量變量本質上是一個數組(地圖/字典)。以下是等效的想法:
<?php
$foo = array('a' => 1);
$bar = 'a';
echo $foo[$bar]."\n";
$foo_a = 1;
$bar = 'a';
$vv = "foo_$bar";
echo $$vv."\n";
?>
因此,如果您將「變量變量」包裝到父數組中,則可以取消它們。
我見過人們使用內部類的變量屬性:
<?php
class Foo
{
private $a = 1;
public function __get($key)
{
if (isset($this->$key)) return $this->$key;
}
}
$foo = new Foo();
echo $foo->a;
?>
但同樣,你可以使用數組:
<?php
class Foo
{
private $props = array('a' => 1);
public function __get($key)
{
if (array_key_exists($key, $this->props))
return $this->props[$key];
}
}
$foo = new Foo();
echo $foo->a;
?>
與外班:
<?php
class Foo
{
public $a = 1;
}
$foo = new Foo();
$prop = 'a';
echo $foo->{$prop};
?>
所以在編寫自己的受控代碼時,您從不「有」使用變量變量或變量屬性。我個人的偏好是從不使用變量變量。我偶爾使用變量屬性,但當我以這種方式訪問數據時,更喜歡使用數組。
我主要用它來減少在一個php文件的開頭消毒GET/POST數據複製粘貼: 它使消毒變量與專有名詞:
$fields=array('age','name','gender','email','username');
foreach($fields as $field) {
if (empty($_REQUEST[$field] === false)
${$field} = sanitize($_REQUEST[$field]);
else
${$field} = '';
}
所有這些行,而不是:
if (empty($_GET['age']) === false)
$age= sanitize($_GET['age']);
else
$age= '';
if (empty($_GET['name']) === false)
$name= sanitize($_GET['name']);
else
$name = '';
if (empty($_GET['gender']) === false)
$gender= sanitize($_GET['gender']);
else
$gender= '';
if (empty($_GET['email']) === false)
$email= sanitize($_GET['email']);
else
$email= '';
if (empty($_GET['username']) === false)
$username= sanitize($_GET['username']);
else
$username= '';
我希望它能幫助
爲什麼不只是'array_map'? – user151841 2017-08-12 02:05:36
- 1. 什麼是實例變量?
- 2. 什麼是靜態變量的實際內存位置?
- 3. 變量workspace_loc的實際值?
- 4. 實例變量的目的是什麼?
- 5. 什麼是變量?
- 6. 什麼是「變量=變量|| {}」在JavaScript
- 7. 什麼是這種變量$變量
- 8. 變量++和變量是什麼意思?
- 9. 什麼是變量的一個實例?
- 10. PHP - 實際執行變量
- 11. 什麼是isa實例變量?
- 12. Java - 什麼是實例變量?
- 13. 什麼是新的變量
- 14. 什麼是vim的@@變量?
- 15. 什麼時候變量實際上有用?
- 16. 變量變量:什麼時候有用?
- 17. 什麼是原子變量,它的用法是什麼?
- 18. GetTickCount()實際測量什麼?
- 19. 爲什麼我的變量不是用SESSION變量設置的?
- 20. 什麼時候顯示mText(TextView的成員變量),實際上?
- 21. 捕獲的變量......「捕獲」實際上代表什麼?
- 22. 什麼時候變量的後綴操作符實際增加?
- 23. 爲什麼java ref vars根據實際對象調用方法,因爲變量基於ref變量類型?
- 24. 什麼是const變量?
- 25. 什麼是「安全變量」?
- 26. 什麼是「自由變量」?
- 27. 什麼是純變量?
- 28. 這是什麼變量`instantiated`
- 29. 什麼是可變常量?
- 30. 爲什麼變量是NULL?
//讓新手程序員動態地更改數據,而不使用「複雜的東西」之類的複合類型(數組和對象)// 一旦學習完畢,它並不複雜。 – dreftymac 2012-11-26 23:18:10
我認爲這是引號的意思。 – user151841 2012-11-27 15:19:58
這個答案如何得到upvoted很多次,並被接受? – jasonszhao 2014-06-04 00:15:15