2010-06-24 4 views
21

Dans le code ci-dessous, j'appelle une fonction (il s'agit justement d'un constructeur) dans laquelle j'ai une indication de type. Quand je lance le code que je reçois l'erreur suivante:Erreur lors de la transmission de la chaîne dans la méthode avec indication de type

Catchable erreur fatale: Argument 1 passé à la question :: __ construct() doit être une instance de chaîne, chaîne donnée, appelée à run.php sur la ligne 3 et défini dans question.php en ligne

D'après ce que je peux dire à l'erreur me dit que la fonction attend une chaîne, mais une chaîne a été adoptée. Pourquoi n'accepte-t-il pas la chaîne transmise?

run.php:

<?php 
require 'question.php'; 
$question = new Question("An Answer"); 
?> 

question.php:

<?php 
class Question 
{ 
    /** 
    * The answer to the question. 
    * @access private 
    * @var string 
    */ 
    private $theAnswer; 

    /** 
    * Creates a new question with the specified answer. 
    * @param string $anAnswer the answer to the question 
    */ 
    function __construct(string $anAnswer) 
    { 
     $this->theAnswer = $anAnswer; 
    } 
} 
?> 

Répondre

7

Il suffit de retirer string du constructeur (not supported), il devrait fonctionner correctement par exemple:

function __construct($anAnswer) 
{ 
    $this->theAnswer = $anAnswer; 
} 

de travail Exemple:

class Question 
{ 
    /** 
    * The answer to the question. 
    * @access private 
    * @var string 
    */ 
    public $theAnswer; 

    /** 
    * Creates a new question with the specified answer. 
    * @param string $anAnswer the answer to the question 
    */ 
    function __construct($anAnswer) 
    { 
     $this->theAnswer = $anAnswer; 
    } 
} 

$question = new Question("An Answer"); 
echo $question->theAnswer; 
3

type hinting ne peut être utilisé pour les types de données d'objets (ou tableaux depuis 5.1), et non pour les types de base comme string, integer, float, booléennes

27

PHP ne supporte pas l'indication de type pour les valeurs scalaires. Actuellement, c'est seulement possible pour les classes, les interfaces et les tableaux. Dans votre cas, il attend un objet qui est une instance d'une "chaîne" class.

Il existe actuellement une implémentation supportant cela dans la version de tronc SVN de PHP, mais il est indécis si cette implémentation sera celle qui sera publiée dans les futures versions de PHP, ou si elle sera supportée du tout.

+0

C'est parce que tous sont massés scalaires dans l'autre, au besoin en PHP, 0 == false, etc. Tels que, vous ne pouvez pas taper allusion un scalaire. C'est la cause de beaucoup de discussions sur les internes PHP, dont je suis membre. – Fuser97381

0

NOTE

"déclarations de type" ("de type hinting" alias) sont disponibles pour les types suivants depuis PHP 7.0.0:

  • bool Le paramètre doit être une valeur booléenne.
  • float Le paramètre doit être un nombre à virgule flottante.
  • int Le paramètre doit être un nombre entier.
  • string Le paramètre doit être une chaîne.
  • bool Le paramètre doit être une valeur booléenne.

pour les types suivants depuis PHP 7.1.0:

  • iterable Le paramètre doit être soit un tableau ou un instanceof Traversable.

A partir de maintenant une autre réponse à cette question est en fait (sorte de):

Passer la version PHP pour PHP7.x et le code fonctionnera comme prévu.

http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration

Questions connexes