2010-06-24 3 views
21

En el siguiente código, invoco una función (resulta ser un constructor) en la que tengo una sugerencia de tipo. Cuando ejecuto el código me sale el siguiente error:Error al pasar la cadena al método con insinuación de tipo

error grave capturable: 1 Argumento pasado a la pregunta :: __ construct() debe ser una instancia de la cadena, cadena dada, llamado en run.php en la línea 3 y se define en question.php en la línea

de lo que puedo decir el error me está diciendo que la función está a la espera de una cadena, pero se pasa una cadena. ¿Por qué no acepta la cadena pasada?

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; 
    } 
} 
?> 

Respuesta

7

Basta con retirar string desde el constructor (not supported), que debería funcionar bien, por ejemplo:

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

Ejemplo de trabajo:

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

Tipo dando a entender sólo se puede utilizar para los tipos de datos de objetos (o arrays desde 5,1), no para los tipos básicos como cadena, entero, flotador, Boolean

1

Desde el PHP documentación (http://php.net/manual/en/language.oop5.typehinting.php)

Type Hints can only be of the object and array (since PHP 5.1) type. Traditional type hinting with int and string isn't supported.

No hay manera de hacer alusión string s, s int o cualquier otro tipo primitivo

27

PHP no es compatible con la sugerencia de tipo para valores escalares. Actualmente, solo es posible para clases, interfaces y matrices. En su caso, está esperando un objeto que sea una instancia de una "cadena" clase.

Actualmente hay una implementación que respalda esto en la versión SVN troncal de PHP, pero no está decidido si esa implementación será la que se lanzará en versiones futuras de PHP, o si será compatible.

+0

Es porque los escalares son todos masajes en el uno al otro, según sea necesario en PHP, por lo que 0 == false, etc. Tales como, no se puede escribir insinuar un escalar. Es motivo de mucha discusión sobre los aspectos internos de PHP, de los que soy miembro. – Fuser97381

0

NOTA

"declaraciones de tipo" (también conocido como "tipo dando a entender los") están disponibles para los siguientes tipos a partir de PHP 7.0.0:

  • bool El parámetro debe ser un valor booleano.
  • float El parámetro debe ser un número de coma flotante.
  • int El parámetro debe ser un número entero.
  • string El parámetro debe ser una cadena.
  • bool El parámetro debe ser un valor booleano.

para los siguientes tipos a partir de PHP 7.1.0:

  • iterable El parámetro debe ser o bien una matriz o un instanceof de Traversable.

Así que de ahora en otra respuesta a esta pregunta en realidad es (tipo de):

interruptor de la versión de PHP a PHP7.x y el código funcionará como se espera.

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

Cuestiones relacionadas