2010-08-19 87 views
9

Biến biến có vẻ khá thú vị, nhưng tôi không thể nghĩ ra một kịch bản mà ở đó người ta thực sự sẽ sử dụng chúng trong môi trường sản xuất. Kịch bản như vậy sẽ là gì? Chúng được sử dụng như thế nào?Việc sử dụng biến số thực tế là gì?

Trả lời

4

Mục đích của nó, tôi đoán, là cho phép người lập trình mới làm quen thay đổi dữ liệu mà không sử dụng "công cụ phức tạp" như các loại tổng hợp (mảng và đối tượng).

Tôi không bao giờ sử dụng chúng.

+0

// cho phép các lập trình viên mới làm quen để tự động thay đổi dữ liệu mà không cần sử dụng "công cụ phức tạp" như các loại composite (mảng và đối tượng) // Nó không phức tạp một khi nó đã được học. – dreftymac

+1

Tôi nghĩ đó là ý nghĩa của dấu ngoặc kép. – user151841

+1

câu trả lời này được tăng lên nhiều lần và được chấp nhận như thế nào? – jasonszhao

1

nghĩ về nó để sử dụng trong một hệ thống template mà bạn đang sử dụng các file PHP và cần phải thiết lập trong các biến:

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

Bây giờ giả sử bạn sử dụng những tên biến trong mẫu của bạn, bạn có thể gọi nó và vượt qua biến vào nó để sử dụng.

echo fetch_template('hi_there.tpl', array('name'=>'JJ')); 

Sau đó, trong mẫu của bạn:

Hello <?php echo $name; ?>! 
+0

Điều tương tự này có thể được thực hiện với ['extract'] (http://ca.php.net/manual/en/function.extract.php) –

+2

Và bây giờ bạn có một lỗi' $ vars' có một khóa '' tệp "'. Đây là lý do tại sao biến biến (và 'trích xuất', cho rằng vấn đề) là nguy hiểm. Nó sẽ khó khăn hơn nhiều để sử dụng một cái gì đó như '$ m ['var']' trong mẫu? – Artefacto

+0

@Daniel: ví dụ mã nói rõ ràng rằng có thể được thực hiện với trích xuất(). Đây là một ví dụ. @Artefecto: điều này đã không được sản xuất để chứng minh bảo mật, nhưng thay vì sử dụng các biến biến. Tôi không bao giờ chủ trương truyền các biến một cách mù quáng như bất cứ thứ gì trong mảng $ _GET. – Jage

1

Cá nhân, tôi sử dụng chúng khá thường xuyên. Tất cả các cuộc gọi của các loại sau đây sử dụng biến-biến:

$foo->$bar = 'test'; 
$foo->$bar(); 
$bar(); 

Vì vậy, bất cứ lúc nào bạn làm một phương pháp/chức năng cuộc gọi động, bạn đang sử dụng biến-biến ...

Một sử dụng chung cho điều này là truy cập các thuộc tính được bảo vệ thông qua phương pháp ma thuật __get. Tôi đã nhìn thấy những điều sau đây khá thường xuyên:

public function __get($name) { 
    return isset($this->$name) ? $this->$name : null; 
} 

Mà theo định nghĩa được sử dụng các biến biến để cung cấp đọc truy cập vào các thành viên được bảo vệ ...

Tôi chưa bao giờ trực tiếp sử dụng cú pháp $$var (và không nghĩ rằng tôi sẽ bao giờ). Tôi đã thấy nó được sử dụng để truy cập các biến toàn cầu theo tên global $$name; echo $$name;, nhưng điều tương tự có thể được thực hiện với cú pháp $_GLOBALS[$name], vì vậy đó không phải là trường hợp sử dụng tốt (chưa kể rằng việc sử dụng các biến toàn cầu thường được xem là thực hành không tốt). .

+1

Đó không phải là biến số biến. Phương thức không phải là biến. – Artefacto

+0

Mặc dù chúng có thể là (loại) nếu điều này xảy ra: http://wiki.php.net/rfc/closures/object-extension#status_as_of_august_10_2010 – Artefacto

+0

Đó là một hàm biến. Bạn đúng. Nó vẫn hoạt động trên cùng một chính mặc dù (nơi biến được dereferenced để xác định đường dẫn thực hiện) ... – ircmaxell

1

Tôi thấy nó hữu ích trong một kịch bản duy nhất. Tôi đã có kết quả API YouTube ở định dạng JSON, như thế này

$obj->media$title => Video title 

Vì vậy, tôi sử dụng nó như

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

Vì vậy, nó làm việc cho tôi ở đây :)

+0

Bạn chỉ có thể làm '$ obj -> {'media $ title'}'. – Artefacto

2

Một biến biến về cơ bản là một mảng (bản đồ/từ điển). Sau đây là các ý tưởng tương đương:

<?php 
$foo = array('a' => 1); 
$bar = 'a'; 
echo $foo[$bar]."\n"; 

$foo_a = 1; 
$bar = 'a'; 
$vv = "foo_$bar"; 
echo $$vv."\n"; 
?> 

Vì vậy, nếu bạn "biến biến" thành mảng mẹ, bạn có thể loại bỏ chúng.

người mà tôi đã nhìn thấy sử dụng tài sản biến bên trong các lớp:

<?php 
class Foo 
{ 
    private $a = 1; 

    public function __get($key) 
    { 
    if (isset($this->$key)) return $this->$key; 
    } 
} 

$foo = new Foo(); 
echo $foo->a; 
?> 

Nhưng một lần nữa, bạn có thể sử dụng một mảng:

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

Và lớp bên ngoài:

<?php 
class Foo 
{ 
    public $a = 1; 
} 

$foo = new Foo(); 
$prop = 'a'; 
echo $foo->{$prop}; 
?> 

Vì vậy, bạn không bao giờ "có" để sử dụng biến biến hoặc thuộc tính biến khi viết mã được kiểm soát của riêng bạn. Sở thích cá nhân của tôi là không bao giờ sử dụng biến biến. Đôi khi tôi sử dụng các thuộc tính biến, nhưng thích sử dụng các mảng khi tôi sẽ truy cập dữ liệu theo cách đó.

0

tôi chủ yếu sử dụng nó để giảm copy-paste trong vệ sinh get/post dữ liệu trong sự khởi đầu của một file php: Nó làm biến vệ sinh với tên riêng:

$fields=array('age','name','gender','email','username'); 

foreach($fields as $field) { 
    if (empty($_REQUEST[$field] === false) 
     ${$field} = sanitize($_REQUEST[$field]); 
    else 
     ${$field} = ''; 
} 

thay vì tất cả những dòng này:

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= ''; 

tôi hy vọng nó giúp

+0

Tại sao không chỉ 'mảng_map'? – user151841

Các vấn đề liên quan