Maintenant, avant de sauter à la façon dont vous ne devriez pas mélanger les étendues: Je le sais. Cependant, il s'agit d'un cas où le mélange de portée doit se produire ou si une duplication de code majeure doit avoir lieu, rien autour de cela. Et je préférerais le mixage.exporter la variable vers la portée précédente dans PHP
Cela dit, je voudrais ce code:
function a() {
$a = "a";
$b = "b";
$c = "c";
}
function b() {
a();
echo $a . $b . $c;
}
b(); // Output: abc
echo $a; // Should raise a notice that $a is undefined
pour pouvoir travailler comme commenté. Je sais que ce n'est pas possible dans la plupart des langues - j'ai pu le faire dans Ruby, cependant; et je me demande si vous pouvez le faire avec PHP.
Les noms des variables ne sont pas connus à l'avance dans la situation réelle.
Encore une fois, c'est la duplication de code ou ceci - absolument pas moyen de contourner cela.
En outre, ce serait bien si a
devait être quelque chose comme a('b')
ou quelque chose.
En réalité, le code est la suivante:
static function renderError($what, $vararray) {
foreach($vararray as $key => $val) { /* this foreach is the code we want to decouple */
$key = 'e_'.$key;
$$key = htmlspecialchars($val);
}
ob_clean();
exit(eval('?>'.file_get_contents(ROOT."/templates/$what.php")));
}
Avec un appel comme E_Render::renderError('NotFound', array('requested_url' => '/notfound', 'misspelling' => '/reallynotfound'));
Puis, dans les modèles/NotFound.php, vous auriez quelque chose comme:
<html>
<body>
<?php echo $e_requested_url; ?> could not be found. Did you mean <?php echo $e_misspelling: ?>?
</body>
</html>
Nous préférerions vraiment que nos auteurs de gabarits ne fassent rien de plus que cela ... bien que $e['requested_url']
pourrait être fait si rien de mieux n'était disponible. Pourquoi ne pouvez-vous pas renvoyer $ a d'un()?
Garder les noms de variables $ a, $ b, $ c est critique. Tant pis. –
+1 Vous l'avez eu en premier. Vous n'avez pas déclaré $ a, $ band $ c comme membres du cours? – NAVEED
@NAVEED Ne pas avoir à. PHP peut ajouter des membres de classe à l'exécution – NullUserException