Je veux convertir les arguments en une fonction dans un tableau associatif fort> avec des clés égales par rapport aux noms de variable de paramètres et les valeurs égales aux valeurs de paramètre.
php: p> Comment puis-je faire cela? p> p>
5 Réponses :
Vous pouvez le faire en utilisant compact code>
:
function myFunc($params) { }
La raison pour laquelle je n'aime pas que ce soit les noms variables doivent être répétés.
Regardez get_defined_vars code> alors.
get_defined_vars () est ce dont vous avez besoin si aucun autre var est défini avant son appelé à l'intérieur de la fonction (vous pouvez Assurez-vous que cela en fait la première chose que vous faites à l'intérieur de la fonction).
function my_function($a, $b, $c) { $params = get_defined_vars(); // <--- create the $params array var_dump($params['a'] === $a); // results in bool(true) var_dump($params['b'] === $b); // results in bool(true) var_dump($params['c'] === $c); // results in bool(true) }
J'aurais dû utiliser cela depuis des années. La bonne réponse.
J'ai suscité la réponse de @ Nickf mais j'aimerais ajouter que Compact () est également un excellent moyen d'instancier un modèle à l'aide d'un CTOR:
class User { public $email; public $password; public $firstName; public $lastName; public function __construct ( $email, $password, $firstName, $lastName ) { foreach ( compact( array_keys( (array)$this )) as $k => $v ) $this->$k = $v; } }
Pas ce que je cherchais - mais toujours un tour assez cool pour justifier un uppote.
Comme cela a été suggéré, mais non implémenté: vous pouvez utiliser alors vous pouvez appeler cela de la même manière, que ce soit dans une fonction ou une méthode: quelle sortie : p> réflexion
Pour recueillir les noms de paramètres, puis associez-les avec les valeurs: array(2) {
["x"]=>
int(7)
["y"]=>
int(2)
}
array(1) {
["z"]=>
int(4)
}
Arguments nommés PHP 8+
class User { private string $email; private string $password; public string $firstName; protected string $lastName; public function __construct(...$arguments) { setterObject($this, ...$arguments); var_dump('email: ' . $this->email); var_dump('password: ' . $this->password); var_dump($this->firstName); var_dump($this->lastName); } } new User(email:'xxxxx@email.com', password: '#@some@password@_', firstName: 'firstName', lastName: 'lastName'); function setterObject(object $obj, mixed ...$arguments) { $args = get_defined_vars()['arguments']; //just named arguments if (count(array_filter(array_keys($args), 'is_string')) ===count($args) ) { array_map(function ($prop) use ($obj,$args ) { $prop->setAccessible(true); if(!is_null($args[$prop->getName()])) { $prop->setValue($obj, $args[$prop->getName()]); } }, (new ReflectionObject($obj))->getProperties()); }else{ throw new Exception('the object was not initialized'); } }
Y a-t-il une raison pour laquelle vous ne pouvez pas simplement définir la fonction initiale pour accepter un tableau comme premier argument et nourrir un tableau?
MEDER: Cela permettrait 1) fournir une API laide, et 2) nécessite beaucoup de modifications apportées à la source. Beaucoup de ces fonctions existent déjà et sont appelées.
Je ne vois pas vraiment pourquoi ce serait une API "laide" - pour moi, il serait plus propre et semblable à nourrir des dictionnaires comme des arguments en python et d'alimenter des objets dans Ecmascript.
Il rend la documentation plus claire et permet à PHP appliquer que chaque fonction est adoptée le nombre correct / type d'arguments.