2017-03-18 1 views
1

En PHP manual on peut lire:bug ou fonctionnalité lorsque la propriété trait est surchargé avec une valeur différente

Si un trait définit une propriété, alors une classe ne peut pas définir une propriété avec le même nom, sauf si elle est compatible (même visibilité et valeur initiale), sinon une erreur fatale est générée. Avant PHP 7.0.0, définir une propriété dans la classe avec la même visibilité et la même valeur initiale que dans le trait, a déclenché un avis E_STRICT.

Il y a aussi un exemple:

<?php 
trait PropertiesTrait { 
    public $same = true; 
    public $different = false; 
} 

class PropertiesExample { 
    use PropertiesTrait; 
    public $same = true; // Strict Standards 
    public $different = true; // Fatal error 
} 
?> 

Nous allons jouer avec cela et enlever $ différente propriété et valeur définie différente de $ même propriété (tout testé en PHP 7.1). Selon les docs, cela devrait provoquer une erreur fatale, mais en fait, ce n'est pas le cas. Mais dès que nous changeons par exemple true à false il provoquera à nouveau une erreur fatale.

Il semble que cela ne fonctionne pas exactement comme il est décrit dans la documentation - il semble que certains moulages sont faits avant la comparaison. Cependant, il pourrait être très délicate, car elle pourrait conduire à des comportements inattendus, par exemple:

trait PropertiesTrait 
{ 
    public $same = true; 

    public function message() 
    { 
     if ($this->same === true) { 
      return "A"; 
     } 
     return "B"; 
    } 
} 

class PropertiesExample 
{ 
    use PropertiesTrait; 
    public $same = 2; 
} 

$example = new PropertiesExample(); 
echo $example->message(); 

lors de l'analyse du code de trait, vous pouvez prévoir cette méthode message() retournera A comme d'après la documentation, il est impossible de passer outre cette propriété avec une valeur différente, mais il semble en raison de moulages, en fait, il est.

Donc la question est - est-ce un bug ou peut-être que c'est la façon dont cela fonctionne et où pouvons-nous lire dans le manuel PHP sur ces moulages pour les propriétés des traits?

+0

Si vous pensez que c'est un bug, alors je vous recommande soulever un rapport de bogue sur [bugs.php.net] (https://bugs.php.net/) –

+0

@MarkBaker J'ai fini avec en ajoutant cela comme un bug et il semble qu'il est - https://bugs.php.net/bug.php?id=74269 –

Répondre

1

Cela semble être un problème. Je l'ai signalé ici: https://bugs.php.net/bug.php?id=74269

Selon commentaire ajouté:

La logique de détection des conflits utilise le compare_function de zend_operator, qui fait des comparaisons en vrac. Le RFC d'origine ne dit pas s'il faut être strict ou lâche mais je pense que l'intention est que ce soit strict.