Création d'un attribut non défini d'un objet ?! L'empecher ?

Eléphant du PHP | 419 Messages

30 mai 2014, 18:55

Bonjour,
C'est encore moi... j'utilise apache Thrift pour sérialiser des données pour les stocker.
Thrift va générer des classes automatiquement en fonction d'une structure qu'on a défini.
class monobjet {
  static $_TSPEC;

  public $iso = null;

  public function __construct($vals=null) {
    if (!isset(self::$_TSPEC)) {
      self::$_TSPEC = array(
        1 => array(
          'var' => 'iso',
          'type' => TType::STRING,
          ),
        );
    }
    if (is_array($vals)) {
      if (isset($vals['iso'])) {
        $this->iso = $vals['iso'];
      }
    }
  }
J'oublie les méthodes.. (qui ne servent qu'à la sérialisation)

Je peux donc attribuer une valeur:
$objetcree = new monobjet();
$objetcree->iso = "nimporte quoi en string";
(Thrift va vérifier le type de la donnée.

Mais mon problème c'est qu'il m'est aussi possible de faire :
$objetcree->nimportequoi = "blabla";
Alors que je n'ai à aucun moment défini "nimportequoi" dans la classe ...
Pourquoi est ce que rien ne bloque ?

Il y a quelque chose que je n'arrive pas à comprendre...

Pouvez-vous m'éclairer ?

Merci !
Aucun site en création...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

31 mai 2014, 00:43

Salut,

Regarde du côté de la surcharge d'objet : http://fr2.php.net/manual/fr/language.o ... oading.php.

Ton framework semble te poser pas mal de soucis.
Je n'en vois pas trop l'intérêt mais bon c'est un choix technique.


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 419 Messages

31 mai 2014, 14:03

L'avantage de thrift est qu'il fait parti du framework Hadoop (big data).
Il permet de sérialiser en binaire tout en réduisant la taille, en typant et en validant la structure. (même si je rajoute un attribut non défini ou si je mets un string alors qu'il attend un entier, il donnera une erreur et ne sérialisera pas)
Il permet aussi de faire du RPC (échange de données cross-language, par exemple : client php et serveur java)

Si tu as un peu de temps et que t'as envie de comprendre: http://blog.octo.com/serialisation-thri ... l-buffers/

En fait, c'est la première fois que je me pose la question de sérialiser quelque chose... (je suis en stage)

Il ne me pose pas tant de souci que ça mais ce n'est que pour ma culture personnelle.
Je ne trouve pas normal d'ajouter un attribut à un objet alors qu'il n'a pas été défini.. ça va au delà de ma définition de l'orienté objet.

Merci pour le lien, je comprends déjà un peu mieux !

Le php ne sera pas le langage de production ( bien entendu.. ), je voulais juste me mettre à jour.
Aucun site en création...

ViPHP
xTG
ViPHP | 7331 Messages

31 mai 2014, 14:41

En fait c'est parce que PHP permet la définition dynamique. ;)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

01 juin 2014, 02:12

PHP est un langage utilisable pour des plateformes de prod.
C'est un langage très "permissif" et il faut bien prévoira chose ;)
Du coup y a moyen de faire ce que l'on veux mais y a un peu de boulot.

La serialisation d'objet étant natif je ne pose pas trop ce type de problème.
Sinon en "cross langage" c'est du service web (rest / soap ou json).


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 419 Messages

01 juin 2014, 15:16

Ah bon? la sérialisation et compression d'objet en binaire est native ?
Je sais que le php aurait pu être le langage de prod mais ça ne sera pas le cas. (logiciel codé en delphi&ruby)

Bref merci encore ;)
Aucun site en création...