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
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.
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; ?>!
Đ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) –
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
@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
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). .
Đó không phải là biến số biến. Phương thức không phải là biến. – Artefacto
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
Đó 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
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 :)
Bạn chỉ có thể làm '$ obj -> {'media $ title'}'. – Artefacto
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 đó.
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
Tại sao không chỉ 'mảng_map'? – user151841
- 1. Việc sử dụng thực tế biến "động" trong C# 4.0 là gì?
- 2. Việc sử dụng "biến thành" trong qt là gì?
- 3. việc sử dụng giao diện thực tế trong java là gì?
- 4. Việc sử dụng biến chia sẻ trong VB.NET là gì?
- 5. SQLite: giới hạn thực tế là gì?
- 6. Ứng dụng thực tế trong cuộc sống là gì?
- 7. Việc sử dụng GADT thực tế trên thế giới
- 8. Cà ri JavaScript: các ứng dụng thực tế là gì?
- 9. Việc sử dụng Indexers là gì?
- 10. Việc sử dụng các trường ẩn có thực tế không?
- 11. Phương pháp đa biến nội suy nào là tốt nhất để sử dụng thực tế?
- 12. Việc sử dụng "??" là gì?
- 13. Phương pháp số được sử dụng trong việc thực hiện IRR này là gì?
- 14. Một số ứng dụng thực tế của thuật toán ROT13 là gì?
- 15. Việc sử dụng ^: động trên xác thực là gì?
- 16. Một số trường hợp sử dụng phổ biến để sử dụng Microkernel của Akka là gì?
- 17. Việc sử dụng thực tế cho sự lười biếng như một tính năng ngôn ngữ được tích hợp là gì?
- 18. Việc sử dụng Deployment.Current.Dispatcher.BeginInvoke (() => {...}) là gì?
- 19. Việc sử dụng "khoan dung" là gì?
- 20. Việc sử dụng singletonList là gì?
- 21. Ví dụ điển hình về việc sử dụng biến đăng ký trong C là gì?
- 22. Sử dụng thực tế mô đun (%) trong lập trình là gì?
- 23. Chữ ký thực tế sử dụng Reflection
- 24. việc sử dụng string.Clone() là gì?
- 25. StringIO trong python được sử dụng trong thực tế là gì?
- 26. Sử dụng thực tế cây biểu thức
- 27. Xác nhận hoặc NSAssert tốt cho thực tế là gì?
- 28. jQuery .each() - Sử dụng thực tế?
- 29. Vị trí bộ nhớ thực tế cho các biến tĩnh là gì?
- 30. Sử dụng thực tế từ khóa `stackalloc`
// 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
Tôi nghĩ đó là ý nghĩa của dấu ngoặc kép. – user151841
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