web-dev-qa-db-fra.com

PHP Cast dans ma classe

pourquoi ce n'est pas possible:

$user = (User) $u[0];

mais c'est possible

$bool = (boolean) $res['success'];

J'utilise PHP 7.0.

6
SexyMF

Comme je le sais, dans PHP, vous ne pouvez attribuer que certains types:

(int), (integer) - cast to integer
(bool), (boolean) - cast to boolean
(float), (double), (real) - cast to float
(string) - cast to string
(binary) - cast to binary string (PHP 6)
(array) - cast to array
(object) - cast to object
(unset) - cast to NULL (PHP 5)

(voir Type Casting )

À la place, vous pouvez utiliser instanceof pour vérifier un type spécifique:

if($yourvar instanceof YourClass) {
    //DO something
} else {
    throw new Exception('Var is not of type YourClass');
}
7
Jarlik Stepsto

Outre la réponse à la question de savoir pourquoi cela n'est pas possible, je vous suggérerais d'écrire une fonction de générateur qui crée un objet, en fonction de votre entrée. donc ça ressemblerait à quelque chose comme

$user = User::buildFromSomeArrayInput($u[0]);

Et demandez ensuite à un générateur de créer un nouvel objet User, d’affecter les bonnes propriétés, etc. Vous pouvez simplement faire tout cela à la place, bien sûr, mais la fonction de générateur vous permet de ne pas le faire à plusieurs peut définir des propriétés privées car il s’agit d’une fonction membre de la classe. C’est un peu plus difficile que de le faire fonctionner comme par magie, mais pas tant que ça… .. Le seul problème que vous pourriez avoir est lorsque vous avez un objet différent qui n’expose pas tous les éléments internes dont vous pourriez avoir besoin. Mais c'est pour une raison, car les internes pourraient changer -> vous ne voulez pas vous fier à cela.

Il y a des hacks qui suggèrent de faire cela avec la sérialisation. Je suggérerais de s'éloigner d'eux, car ils sont fous et, autant que je le sache, pas très clair.

1
Nanne

Les objets et les types primitifs sont différents. Comme ils sont appelés types primitifs, ils sont vraiment simples, peut-être un octet, deux octets ou quatre octets et au plus huit octets. 

Quand on parle d'objet, cet objet peut avoir des attributs différents des autres. Alors la question de PHP sera: "Cet objet appartient-il vraiment à ma classe?" "Comment convertir cet objet dans ma classe?". Ainsi, vous ne pouvez pas analyser immédiatement l'objet à l'aide de 

$myObject = (ClassName) $variable

Alors comment le lancer? Je sais pas, mais d'habitude c'est comme ça:

  1. Créer un constructeur pour la classe
  2. Dans la classe, créez une méthode qui accepte spécifiquement certains paramètres, peut-être un tableau

voici un échantillon:

public class MyAwesomeClass{


     function __construct($thisIsArray){
         $this->attributeA = $thisIsArray["A"];
         $this->attributeB = $thisIsArray["B"];
         ......
     }

     static function fromArray($thisIsArray){
         return MyAwesomeClass($thisIsArray);
     }

}

$obj = MyAwesomeClass::fromArray($attributes);
0
Hans Yulian

La raison en est que "faux" est une chaîne et son vrai. Mais faux est un booléen.

$res['success'] = "false"|;
if ($res['success']) { // returns true
    // this cose will be executed
}

Un autre exemple ici: echo "false" == true ? 111 : 222; qui imprime 111.

Et encore une fois, ... "42" est une chaîne alors que 42 est un nombre.

Vous pouvez toujours vérifier la valeur booléenne d'un contenu variable.

"PHP n’a pas besoin (ni supporte) de définition de type explicite dans la déclaration de variable; le type d’une variable est déterminé par le contexte dans lequel la variable est utilisée. En d’autres termes, si une valeur de chaîne est affectée à la variable $ var, $ var devient une chaîne. Si une valeur entière est alors assignée à $ var, elle devient un entier. "

Un autre exemple de la documentation:

<?php
$foo = 10;   // $foo is an integer
$bar = (boolean) $foo;   // $bar is a boolean
?>

Jetez un oeil les tableaux de comparaison de types .

0
sensorario

PHP supporte deux types de casting.

  1. Casting implicite
  2. Casting explicite

La diffusion implicite est réalisée par PHP. Par exemple, lors de la division de deux entiers (5/2), le résultat sera float (2.5). Cette conversion est faite par PHP.

Casting explicite peut être par nous (programmeur). Comme dans votre question, vous pouvez utiliser () pour convertir un nouveau type de données. Mais tout ne fonctionne pas de cette façon. Parfois, cela peut entraîner une perte de données (le fait de convertir un nombre flottant (2.52) en un entier supprime la valeur décimale, ce qui peut être utile). Incarner des objets peut être risqué, car différents objets se comportent de différentes manières.

En savoir plus sur le casting de type

Donc, si vous envisagez d'incarner un objet, utilisez un constructeur d'objet. 

$user = new User($u[0]);

La classe d'utilisateurs devrait être quelque chose comme ça.

class User {
    public function __construct($user) {
        $this -> user = $user;
    }
}

De cette manière, vous pouvez créer votre propre objet pour manipuler des données relatives à l'utilisateur et plus encore.

0
Supun Kavinda

Si vous voulez simplement vous assurer qu'une variable est une instance de YourClass et laisser la gestion des exceptions au système de types, vous pouvez utiliser la fonction suivante:

function implicitFakeCast($myClass): YourClass
{
    return $myClass;
}

Remarque: cela ne fera pas de transtypage, mais il lève des exceptions en cas de discordance de classe et laisse intellisense le traiter comme une instance de la classe cible.

0
Szabolcs Páll