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.