Có bất kỳ trường hợp sử dụng tốt cho các biến biến?


8

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?


1
Giống như hầu hết các "thủ thuật tối nghĩa", các trường hợp sử dụng thực tế của nó rất hạn chế, thường có nhiều cách sạch hơn để thực hiện các trường hợp sử dụng đó và ngay cả khi trường hợp sử dụng khớp hoàn hảo với thủ thuật đó, sẽ rất khó để duy trì.
Joachim Sauer

1
@JoachimSauer Nó không thực sự tối nghĩa, các biến số là trung tâm của các vòng lặp foreach.
yannis

Câu trả lời:


15

Giả sử một url của http://example.com/hello/worldvà 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.


9
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, không có gì khác. Chất lượng khôn ngoan, nó hoàn toàn tào lao, không sử dụng.
yannis

(PHP newbie ở đây) Tôi không thấy chính xác nơi bạn đã sử dụng các biến số, tôi chỉ thấy các đô la duy nhất. Tôi nghi ngờ điều đó có liên quan đến .htaccess, nhưng tôi cũng không hiểu rõ về điều đó.
Manishearth

3
@YannisRizos - Ví dụ của bạn đang sử dụng tên phương thức biến, không phải biến biến. Nó hoàn toàn khác nhau. Bạn đang gọi một phương thức một cách hiệu quả thông qua sự phản chiếu chứ không phải là một biến bằng sự phản chiếu.
Jonno

1
@Jonno Heh, tôi đã nghĩ chính xác như vậy khi ai đó lần đầu tiên giải thích các biến biến cho tôi;) "Biến" đầu tiên đề cập đến bản chất động của biến (thứ hai) (cấu trúc) và phương thức của nó được tham chiếu động, và đó là về nó. $controller 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?
yannis

1
@YannisRizos - Tôi rất không đồng ý. Một biến số, chính xác là một biến, được tạo ra ở phạm vi của mã được tạo hiện tại. Những gì bạn đang làm ở đây là gọi một phương thức, tên của ai được xác định bởi một biến. Theo logic đó, bất kỳ việc sử dụng 'biến' nào để làm bất cứ điều gì ... 'thay đổi' là một biến số.
Jonno

8

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.


Tương tự ở đây - trong bảy năm tôi làm việc với PHP tôi chưa bao giờ gặp phải vv (dù sao trong mã sản xuất).
miku

Các biến biến có vẻ như là một mánh khóe gọn gàng, nhưng sau đó nó sẽ cắn bạn (hoặc người khác) khủng khiếp sau này khi họ cố gắng nâng cấp / duy trì mã. Biến biến kết hợp với phạm vi toàn cầu dẫn đến thảm họa trong đó chỉ cần đổi tên một biến có thể khiến mã của bạn bị đổ. Điều đó cũng có nghĩa là mã của bạn không thể được cải thiện bởi trình biên dịch JIT trong HHVM nếu đó là một vấn đề.
trình viên

2

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ọ:

  • Không bao giờ giải quyết bất kỳ vấn đề nào mà tùy chọn khác ít nhất là phù hợp như nhau, thường là tốt hơn
  • Làm cho việc quản lý cơ sở mã trở nên khó khăn hơn, vì thay vì một biến riêng biệt với dữ liệu riêng biệt, giờ đây bạn có các biến "được liên kết" được liên kết chặt chẽ với nhau, đó là một mớ hỗn độn đang chờ xảy ra
  • Rất hiếm khi được sử dụng, vì vậy khả năng đọc được giảm xuống do không quen thuộc. Đặc biệt là trong các lớp / phương thức thiếu $ ($ var -> * $ * rogueVar) sẽ là một nỗi đau tạm thời
  • Thông tin cho biến con không có sẵn mà không có cha mẹ. $var = "james";tên var và giá trị ở ngay đó.
  • Ngay cả những âm thanh tổng hợp Icky - "một biến có tên dựa trên một giá trị từ một biến"

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.