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 ?
Ce serait class MyStruct
à l'opposé de object MyStruct
;)
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 ?
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 .
Est-ce que "oups" est une réponse appropriée ici ? Ça m'apprend à répondre rapidement pendant la pause déjeuner...
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
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.
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 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.
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.
0 votes
@ktm, faites-vous référence este comme des structs ?
0 votes
@MiloLaMar : C'est aussi là que j'ai entendu parler pour la première fois des structs PHP. De façon frustrante, le
struct
Le terme "class" n'est pas défini dans le document WSDL, ce qui donne l'impression qu'il s'agit d'un type de données PHP natif.1 votes
@ktm Malheureusement, PHP ne supporte pas les structs comme vous les connaissez en C/C++. Vous ne pouvez donc rien faire de tel :
class pseudostruct { (int) myint; (char) mychar; (string) mychar; } myObj = new pseudostruct;
. Ce serait génial si PHP avait cette fonctionnalité car nous pourrions déclarer des structures de données et espérer lire des données et leur assigner des valeurs de manière très simple et efficace, comme en C. Ce serait aussi génial si nous pouvions prédéfinir la taille mémoire exacte des variables ou utiliser malloc. La lecture des données dans les variables de ma classe de pseudo-structure serait alors amusante !