2010-08-19 34 views

回答

4

我的目的是讓新手程序員在不使用複雜類型(數組和對象)等「複雜東西」的情況下動態更改數據。

我從來沒有使用過它們。

+0

//讓新手程序員動態地更改數據,而不使用「複雜的東西」之類的複合類型(數組和對象)// 一旦學習完畢,它並不複雜。 – dreftymac 2012-11-26 23:18:10

+1

我認爲這是引號的意思。 – user151841 2012-11-27 15:19:58

+1

這個答案如何得到upvoted很多次,並被接受? – jasonszhao 2014-06-04 00:15:15

1

認爲它在一個模板系統使用,你使用的是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; ?>! 
+0

同樣的事情可以通過['extract']完成(http://ca.php.net/manual/en/function.extract.php) – 2010-08-19 16:20:33

+2

現在你有一個bug'$ vars'有一個鍵'「文件「'。這就是爲什麼變量變量(和「提取」,爲此)是危險的。在模板中使用類似'$ m ['var']'的東西會更難嗎? – Artefacto 2010-08-19 16:23:21

+0

@Daniel:代碼示例明確表示可以使用extract()完成。這是一個例子。 @Artefecto:這不是爲了演示安全而生成的,而是爲了使用變量。我從不主張像$ _GET數組中的任何內容那樣盲目地傳遞變量。 – Jage 2010-08-19 16:31:34

1

就個人而言,我使用它們相當頻繁。以下類型的所有呼叫使用可變變量:

$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]語法來完成,所以這不是一個好用例(更不用說使用全局變量通常被認爲是不好的做法)。

+1

那些不是變量變量。方法不是變量。 – Artefacto 2010-08-19 16:31:17

+0

雖然他們可以(種),如果這繼續:http://wiki.php.net/rfc/closures/object-extension#status_as_of_august_10_2010 – Artefacto 2010-08-19 16:33:17

+0

這是一個可變函數。你是對的。它仍然在相同的主體上運行(其中變量被取消引用以確定執行路徑)... – ircmaxell 2010-08-19 16:35:45

1

我發現它在單一場景中很有用。我有一個JSON格式的YouTube API的結果,這樣

$obj->media$title => Video title 

所以我用它像

$mt = 'media$title'; 
$obj->$mt ; 

所以它的工作對我來說在這裏:)

+0

您可以執行'$ obj - > {'media $ title'}'。 – Artefacto 2010-08-19 17:19:58

2

變量變量本質上是一個數組(地圖/字典)。以下是等效的想法:

<?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}; 
?> 

所以在編寫自己的受控代碼時,您從不「有」使用變量變量或變量屬性。我個人的偏好是從不使用變量變量。我偶爾使用變量屬性,但當我以這種方式訪問​​數據時,更喜歡使用數組。

0

我主要用它來減少在一個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= ''; 

我希望它能幫助

+0

爲什麼不只是'array_map'? – user151841 2017-08-12 02:05:36