79 votes

Type de données Structs en php ?

Quelqu'un peut-il me donner un exemple de type de données structs en php ? Comment se fait-il qu'il y ait soudainement quelque chose comme les structs en php ?

14 votes

Où avez-vous lu cette information ? PHP n'a jamais eu de véritable struct type de données.

0 votes

Veuillez montrer le code ou le lien vers l'endroit où vous avez lu des informations sur les structures en PHP.

5 votes

Il a probablement vu le mot struct quand il a var_dumpé un objet soap.

111voto

ASpencer Points 978

Le plus proche d'une structure est un objet dont tous les membres sont publics.

class MyStruct {
    public $foo;
    public $bar;
}

$obj = new MyStruct();
$obj->foo = 'Hello';
$obj->bar = 'World';

Je dirais qu'en regardant le Documentation des classes PHP en vaudrait la peine. Si vous avez besoin d'une structure unique, utiliser le StdObject comme mentionné dans la réponse d'alex .

4 votes

Ce serait class MyStruct à l'opposé de object MyStruct ;)

1 votes

Est-ce que "oups" est une réponse appropriée ici ? Ça m'apprend à répondre rapidement pendant la pause déjeuner...

1 votes

@ASpencer Merci de mentionner également la réponse d'Alex.

51voto

alex Points 186293

Vous pouvez utiliser un tableau

$something = array(
   'key' => 'value',
   'key2' => 'value2'
);

ou avec l'objet standard.

$something = new StdClass();

$something->key = 'value';
$something->key2 = 'value2';

5voto

Ruel Points 6140

Je recommande 2 choses. La première est tableau associatif .

$person = Array();
$person['name'] = "Joe";
$person['age'] = 22;

Le second est classes .

Documentation détaillée ici : http://php.net/manual/en/language.oop5.php

3voto

Max Points 295

Ce sujet est assez haut sur Google, alors j'ai pensé que je pourrais partager mon implémentation d'une pseudo-structure en utilisant la syntaxe PHP8. La méthode toArray() dépend d'Illuminate. \Support\Str pour transformer les clés en cas de serpent (utile pour l'affectation en masse contre les modèles Laravel), mais il suffit de le supprimer s'il ne correspond pas à votre cas d'utilisation.

La classe de base :

<?php

namespace App\Infrastructure\Structs;

use App\Infrastructure\Exceptions\CannotMutateStructException;
use App\Infrastructure\Exceptions\ClassPropertyNotFoundException;
use Illuminate\Support\Str;
use ReflectionClass;

abstract class Struct
{
    /**
     * @param string $name
     * @param mixed $value
     * @throws CannotMutateStructException
     */
    public function __set(string $name, mixed $value): void
    {
        throw new CannotMutateStructException(
            'Structs are immutable. If you need mutable data then use a class instead.'
        );
    }

    public function all(): array
    {
        $reflector = new ReflectionClass(static::class);
        $response = [];

        foreach ($reflector->getProperties() as $property) {
            $response[$property->name] = $this->{$property->name};
        }

        return $response;
    }

    public function toArray(bool $snakeCase = false): array
    {
        $all = self::all();

        if ($snakeCase === false) {
            return $all;
        }

        $snakeCaseAll = [];

        foreach ($all as $key => $value) {
            $snakeCaseAll[Str::snake($key)] =  $value;
        }

        return $snakeCaseAll;
    }
}

Comment l'utiliser :

<?php

namespace App\Infrastructure\Structs;

class Person extends Struct
{
    public function __construct(
        public string $name,
        public int $age,
        public int $heightInCentimetres,
    ) {}
}

Comment interagir avec elle :

>>> $t = new \App\Infrastructure\Structs\Person('Max', 26, 182);

>>> $t->age
=> 26

>>> $t->age = 40
App\Infrastructure\Exceptions\CannotMutateStructException with message 'Structs are immutable. If you need mutable data then use a class instead.'

>>> $t->toArray(true)
=> [
     "name" => "Max",
     "age" => 26,
     "height_in_centimetres" => 182,
   ]

J'espère que cela aidera quelqu'un.

2voto

pikuseru Points 61

J'ai bricolé une classe struct 'dynamique' aujourd'hui, j'ai jeté un coup d'oeil ce soir et quelqu'un a écrit quelque chose de similaire avec une meilleure gestion des paramètres de constructeur, cela peut valoir le coup d'oeil :

http://code.activestate.com/recipes/577160-php-struct-port/

Un des commentaires sur cette page mentionne une chose intéressante en PHP - apparemment, vous pouvez transformer un tableau en objet, ce qui vous permet de faire référence aux éléments du tableau en utilisant la notation de la flèche, comme vous le feriez avec un pointeur structurel en C. L'exemple du commentaire était le suivant :

$z = array('foo' => 1, 'bar' => true, 'baz' => array(1,2,3));
//accessing values as properties
$y = (object)$z;
echo $y->foo;

Je n'ai pas encore essayé moi-même, mais il se peut que vous puissiez obtenir la notation souhaitée en effectuant un simple casting - si c'est tout ce que vous recherchez. Il s'agit bien sûr de structures de données "dynamiques", juste du sucre syntaxique pour accéder aux paires clé/valeur dans un hash.

Si vous cherchez en fait quelque chose de plus statiquement typé, alors la réponse d'ASpencer est le droïde que vous cherchez (comme Obi-Wan pourrait dire).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X