9
votes

Comment puis-je convertir la liste des paramètres de la fonction PHP en une matrice associative?

Je veux convertir les arguments en une fonction dans un tableau associatif avec des clés égales par rapport aux noms de variable de paramètres et les valeurs égales aux valeurs de paramètre.

php: xxx

Comment puis-je faire cela?


4 commentaires

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.


5 Réponses :


12
votes

Vous pouvez le faire en utilisant compact code> :

function myFunc($params) {

}


2 commentaires

La raison pour laquelle je n'aime pas que ce soit les noms variables doivent être répétés.


Regardez get_defined_vars alors.



9
votes

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)
}


1 commentaires

J'aurais dû utiliser cela depuis des années. La bonne réponse.



4
votes

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;
    }
}


1 commentaires

Pas ce que je cherchais - mais toujours un tour assez cool pour justifier un uppote.



1
votes

Comme cela a été suggéré, mais non implémenté: vous pouvez utiliser réflexion Pour recueillir les noms de paramètres, puis associez-les avec les valeurs: xxx pré>

alors vous pouvez appeler cela de la même manière, que ce soit dans une fonction ou une méthode: xxx pré>

quelle sortie : p>

array(2) {
  ["x"]=>
  int(7)
  ["y"]=>
  int(2)
}
array(1) {
  ["z"]=>
  int(4)
}


0 commentaires

0
votes

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');
    }
}


0 commentaires