Existem bons casos de uso para variáveis ​​variáveis?

8

Hoje encontrei esta pequena jóia do PHP chamada variáveis ​​variáveis .

$literal = "Hello";
$vv = "literal";
echo $$vv; // => prints "Hello"

Na verdade, existem casos de uso reais para esse recurso de idioma?

miku
fonte
1
Como a maioria dos "truques obscuros", seus casos de uso reais são muito limitados, geralmente existem maneiras muito mais limpas de implementar esses casos de uso e, mesmo que o caso de uso corresponda perfeitamente ao truque, será difícil mantê-lo.
Joachim Sauer
1
@JoachimSauer Não é realmente obscuro, variáveis ​​variáveis ​​estão no coração de todos os loops.
precisa

Respostas:

15

Assumindo um URL http://example.com/hello/worlde o seguinte .htaccess:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ router.php?/$1 [L]

router.php, um roteador excessivamente simplista, seria:

<?php

$request = explode("/", $_SERVER["REQUEST_URI"]);

$controllerClass = $request[0];
$controllerActionMethod = $request[1];

$controller = new $controllerClass();
$controller->$controllerActionMethod(); // hello::world();

?>

Esse é um uso prático bastante padrão de variáveis ​​variáveis. Bom truque, mas você deve ser extremamente cuidadoso ao usá-lo, pois abusar / abusar dele certamente levará a códigos terrivelmente insustentáveis.

Isenção de responsabilidade: O código apresentado na resposta destina-se apenas a ilustrar o uso do recurso. Ele não cobre o design, a segurança, a manutenção ou a sanidade adequados. Não use.

yannis
fonte
9
Isenção de responsabilidade: O código apresentado na resposta destina-se apenas a ilustrar o uso do recurso, nada mais. Qualidade sábia é absolutamente uma porcaria, não use.
precisa
(Novato em PHP aqui) Não vejo onde exatamente você usou as variáveis ​​variáveis, só vejo dólares únicos. Suspeito que isso tenha a ver com o .htaccess, mas também não os entendo bem.
Manishearth
3
@YannisRizos - Seu exemplo está usando um nome de método variável, não uma variável variável. É totalmente diferente. Você está efetivamente chamando um método via reflexão em vez de uma variável por reflexão.
21412 Jonno
1
@ Jonno Heh, eu pensei exatamente o mesmo quando alguém me explicou variáveis ​​variáveis ​​pela primeira vez;) A primeira "variável", no entanto, refere-se à natureza dinâmica da (segunda) variável (a estrutura), e seu método é referenciado dinamicamente, e é sobre isso. $controller é uma variável (a estrutura), mas o que ela contém é definido dinamicamente, portanto, uma variável variável. Um nome meio bobo, não é?
yannis
1
@YannisRizos - eu discordo respeitosamente. Uma variável variável é exatamente aquela variável criada no escopo do código criado atualmente. O que você está fazendo aqui é chamar um método, cujo nome é definido por uma variável. Por essa lógica, qualquer uso de uma 'variável' para fazer qualquer coisa que ... 'varia' é uma variável variável.
Jonno
8

Honestamente? Em quase 10 anos de experiência em PHP, nunca encontrei um problema para o qual a única solução (ou mesmo a melhor solução de uma escolha) fosse usar uma variável variável. O mais próximo que eu tenho é de poder acessar constantes em uma instância de uma classe como $classInstance::CLASS_CONSTANT(que está disponível desde o PHP 5.3) e mesmo assim eu normalmente não tenho muito uso para isso.

Eu suspeito que é uma das muitas verrugas que existem no PHP que parecia uma boa idéia na época.

Portanto, em resposta à sua pergunta, se há casos de uso em que é a melhor ou a única abordagem para um problema específico, eu não os vi.

GordonM
fonte
O mesmo aqui - em sete anos trabalhei dentro e fora do PHP e nunca encontrei vv (no código de produção).
Miku
Variáveis ​​variáveis ​​podem parecer um truque interessante, mas, depois, elas mordem você (ou outra pessoa) horrivelmente mais tarde quando tentam atualizar / manter o código. Variáveis ​​variáveis ​​combinadas com o escopo global resultam em desastre, onde simplesmente renomear uma variável pode fazer com que seu código caia. Isso também significa que seu código não pode ser aprimorado pelo compilador JIT no HHVM, caso isso seja um problema.
Programster
2

Existem bons casos de uso para variáveis ​​variáveis?

Depende da sua definição de "bom".
Minha resposta pessoal é simplesmente não .

Tentei encontrar um apenas para responder a essa pergunta, fiz perguntas de ajuda no SO, onde as pessoas as estão usando, e li os guias e as postagens do blog.

Simplesmente não consigo encontrar um cenário em que possa ser discutido usando uma variável variável que seja mais útil ou útil do que outra abordagem .

Tudo o que eu conseguia pensar e encontrei onde razões contra seu uso.

Eu até li um artigo, com comentários agradecidos e positivos, que discutiam como ele pode facilitar as declarações de troca.
Mudar declarações, "mais simples"?


Eu diria que, mesmo para alguém muito novo no PHP, um array pode ser um pouco mais complicado de entender, mas a curva de aprendizado ultrapassa a de aprender variáveis ​​variáveis ​​assim que começar a tentar usá-las código.

Logo ficaria confuso tentar seguir e controlar o fluxo de variáveis ​​variáveis.
Considerando que, uma vez aprendido, um array é bastante simples de olhar e usar.


Como eu os vejo, eles:

  • Nunca resolva nenhum problema em que outra opção não seja pelo menos igualmente adequada, geralmente melhor
  • Torne o gerenciamento da base de código mais difícil, porque agora, em vez de uma variável separada com dados separados, você agora "uniu" variáveis ​​fortemente acopladas, o que é uma bagunça esperando para acontecer
  • São muito raramente usados, portanto a legibilidade é discutivelmente reduzida devido ao desconhecimento. Especialmente em classes / métodos em que a falta desse $ extra ($ var -> * $ * rogueVar) será uma dor temporária
  • As informações para a variável filho não estão disponíveis sem o pai. $var = "james";nome e valor do var estão bem ali.
  • Até o resumo parece nojento - "uma variável nomeada com base no valor de outra variável"

Até o manual do PHP possui informações que, embora não intencionais, mostram que variáveis ​​variáveis ​​são complicadas e potencialmente "problemáticas":

PHP.net escreveu:

Para usar variáveis ​​variáveis ​​com matrizes, é necessário resolver um problema de ambiguidade. Ou seja, se você escrever $$ a [1], o analisador precisará saber se você pretende usar $ a [1] como uma variável ou se deseja que $$ a seja a variável e, em seguida, o índice [1] de essa variável. A sintaxe para resolver essa ambiguidade é: $ {$ a [1]} para o primeiro caso e $ {$ a} [1] para o segundo.

Como seu uso é muito incomum, eu diria que mesmo desenvolvedores experientes repentinamente teriam alguma curva de aprendizado se outro desenvolvedor usasse isso em seu código.

Variáveis ​​variáveis ​​não podem ser usadas com matrizes Superglobal do PHP dentro de funções ou métodos de classe.
Isso é mais aprendizado e consideração cuidadosa para solucionar problemas introduzidos por variáveis ​​variáveis.

Para nenhum benefício.


Eu acho que eles podem ter sido bastante úteis nos tempos antigos, quando "dinossauros" vagavam pelos datacenters. e o PHP não foram refatorados muito e muito mais rapidamente com coisas como matrizes etc.


Se variáveis ​​variáveis ​​nos deram alguma funcionalidade profunda, ou mesmo altamente úteis, talvez valha a pena usá-las.

No entanto, considerando o que eles oferecem, eu simplesmente não vejo sentido em usá-los, mesmo que uma matriz seja um exagero e use alguns microssegundos mais, por questões de manutenção do código, legibilidade, preservação da sanidade e nenhuma diferença na funcionalidade, apenas use um método alternativo - sempre.

James
fonte