Hôm nay tôi bắt gặp viên ngọc nhỏ PHP này được gọi là biến biến .
$literal = "Hello";
$vv = "literal";
echo $$vv; // => prints "Hello"
Có thực sự có trường hợp sử dụng thực sự cho tính năng ngôn ngữ này?
Hôm nay tôi bắt gặp viên ngọc nhỏ PHP này được gọi là biến biến .
$literal = "Hello";
$vv = "literal";
echo $$vv; // => prints "Hello"
Có thực sự có trường hợp sử dụng thực sự cho tính năng ngôn ngữ này?
Câu trả lời:
Giả sử một url của http://example.com/hello/world
và sau đây .htaccess
:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ router.php?/$1 [L]
router.php
, một bộ định tuyến quá đơn giản, sẽ là:
<?php
$request = explode("/", $_SERVER["REQUEST_URI"]);
$controllerClass = $request[0];
$controllerActionMethod = $request[1];
$controller = new $controllerClass();
$controller->$controllerActionMethod(); // hello::world();
?>
Đó là một cách sử dụng thực tế khá chuẩn của các biến. Thủ thuật gọn gàng, nhưng bạn nên cực kỳ cẩn thận khi sử dụng nó, lạm dụng / lạm dụng nó chắc chắn sẽ dẫn đến mã không thể nhầm lẫn khủng khiếp.
Tuyên bố miễn trừ trách nhiệm: Mã được trình bày trong câu trả lời chỉ nhằm mục đích minh họa việc sử dụng tính năng này. Nó không bao gồm thiết kế phù hợp, bảo mật, bảo trì hoặc vệ sinh. Không được dùng.
.htaccess
, nhưng tôi cũng không hiểu rõ về điều đó.
$controller
là một biến (cấu trúc), nhưng những gì nó giữ được đặt tự động, do đó là một biến biến. Một cái tên ngớ ngẩn, phải không?
Thành thật? Trong gần 10 năm kinh nghiệm PHP tôi chưa bao giờ gặp phải một vấn đề mà giải pháp duy nhất (hoặc thực sự là giải pháp tốt nhất từ một lựa chọn) là sử dụng một biến số. Cách gần nhất mà tôi có là có thể truy cập các hằng số trên một thể hiện của một lớp như $classInstance::CLASS_CONSTANT
(đã có sẵn từ PHP 5.3) và thậm chí sau đó tôi thường không sử dụng nhiều cho nó.
Tôi nghi ngờ đó là một trong nhiều mụn cóc tồn tại trong PHP có vẻ như là một ý tưởng tốt vào thời điểm đó.
Vì vậy, để trả lời câu hỏi của bạn, nếu có những trường hợp sử dụng trong đó là cách tiếp cận tốt nhất hoặc duy nhất cho một vấn đề cụ thể, tôi đã không thấy chúng.
Có bất kỳ trường hợp sử dụng tốt cho các biến biến?
Nó phụ thuộc vào định nghĩa của bạn về "tốt".
Câu trả lời cá nhân của tôi chỉ đơn giản là không .
Tôi đã cố gắng đưa ra một câu trả lời chỉ để trả lời câu hỏi này, tôi đã viết những câu hỏi trợ giúp về SO nơi mọi người đang sử dụng chúng, và đọc một hướng dẫn và bài đăng trên blog.
Tôi chỉ không thể tìm thấy một kịch bản trong đó nó có thể được lập luận bằng cách sử dụng một biến biến là hữu ích hoặc đáng giá hơn so với cách tiếp cận khác .
Tất cả tôi có thể nghĩ và tìm thấy lý do chống lại việc sử dụng chúng.
Tôi thậm chí đã đọc một bài báo, với những bình luận biết ơn và tích cực, trong đó tranh luận về cách nó có thể làm cho các tuyên bố chuyển đổi dễ dàng hơn.
Thay đổi câu lệnh, "đơn giản hơn"?
Tôi tranh luận rằng ngay cả với một người rất mới đối với PHP, một mảng có thể được cho là khó khăn hơn một chút để quấn đầu họ, nhưng đường cong học tập sẽ bỏ qua việc học các biến biến khi họ bắt đầu sử dụng chúng trong phạm vi mã.
Nó sẽ sớm trở nên khó hiểu khi cố gắng theo dõi và kiểm soát dòng biến của các biến.
Trong khi đã học, một mảng khá đơn giản để xem và sử dụng.
Khi tôi thấy họ, họ:
$var = "james";
tên var và giá trị ở ngay đó.Ngay cả hướng dẫn sử dụng PHP cũng có thông tin, trong khi vô tình, cho thấy các biến biến rất phức tạp và có khả năng "rắc rối":
PHP.net đã viết:
Để sử dụng các biến số có mảng, bạn phải giải quyết vấn đề không rõ ràng. Đó là, nếu bạn viết $$ a [1] thì trình phân tích cú pháp cần biết bạn có ý định sử dụng $ a [1] làm biến hay nếu bạn muốn $$ a làm biến và sau đó chỉ mục [1] biến đó. Cú pháp để giải quyết sự mơ hồ này là: $ {$ a [1]} cho trường hợp đầu tiên và $ {$ a} [1] cho lần thứ hai.
Vì việc sử dụng của họ rất không phổ biến, tôi sẽ lập luận rằng ngay cả các nhà phát triển dày dạn cũng sẽ đột nhiên có một số đường cong học tập nếu một nhà phát triển khác sử dụng điều này trong mã của họ.
Các biến biến không thể được sử dụng với các mảng Superglobal của PHP trong các hàm hoặc các phương thức lớp.
Đây là cách học nhiều hơn và xem xét cẩn thận để giải quyết các vấn đề sử dụng biến biến giới thiệu.
Không có lợi.
Tôi nghĩ rằng chúng có thể đã khá hữu ích trong thời đại cũ, khi "khủng long" lang thang các trung tâm dữ liệu. và PHP đã không được tái cấu trúc rất nhiều và nhanh hơn rất nhiều với những thứ như mảng, v.v.
Nếu các biến số đã cho chúng ta một số chức năng sâu sắc, hoặc thậm chí rất hữu ích, thì có lẽ sử dụng chúng sẽ có giá trị học tập.
Tuy nhiên, với những gì họ cung cấp, tôi chỉ không thấy được điểm nào khi sử dụng chúng, ngay cả khi một mảng quá mức và sử dụng thêm một vài phần triệu giây, vì khả năng duy trì mã, dễ đọc, giữ gìn vệ sinh và không có sự khác biệt về chức năng, chỉ là sử dụng một phương pháp thay thế - mọi lúc.