it-swarm-pt.tech

Dica de tipo: parâmetros padrão

Dica do tipo PHP 5

O PHP 5 introduz dicas de tipo. Funções agora são capazes de forçar parâmetros a serem objetos ( especificando o nome da classe no protótipo da função) ou arrays ( desde PHP 5.1). No entanto, se NULL for usado como o valor padrão do parâmetro, será permitido como argumento para qualquer chamada posterior.

O seguinte trecho do exposto acima:

se NULL for usado como o valor padrão do parâmetro, será permitido como argumento para qualquer chamada posterior.

O que está acima significa:

se os parâmetros padrão forem usados ​​com dicas de tipo, ele pode ter apenas NULL como o valor padrão.

isto é o código no código1 está incorreto e resulta em:

Erro fatal: o valor padrão para parâmetros com uma dica de tipo de classe pode ser apenas NULL

code1:

 function setName ( string $name = "happ") {
  ...
  }

Onde o código no código2 está correto:

code2:

 function setName ( string $name = NULL) {
  ...
  }

Por que essa restrição é atribuída no php?

43
ThinkingMonkey

Você não pode digitar seqüências de caracteres de dica, pode apenas digitar objetos e matrizes de dica, portanto, isso está incorreto:

function setName ( string $name = "happ") {

(A razão pela qual você não recebe um erro em tempo de compilação aqui é porque PHP está interpretando "string" como o nome de uma classe.)

A redação nos documentos significa que, se você fizer isso:

function foo(Foo $arg) {

Então o argumento passado para foo () deve ser uma instância do objeto Foo. Mas se você fizer isso:

function foo(Foo $arg = null) {

Então o argumento passado para foo () pode ser uma instância do objeto Foo ou nulo. Observe também que se você fizer isso:

function foo(array $foo = array(1, 2, 3))

Então você não pode chamar foo (nulo). Se você deseja essa funcionalidade, pode fazer algo assim:

function foo(array $foo = null) {
    if ($foo === null) {
        $foo = array(1, 2, 3);
    }

[Edit 1] A partir de PHP 5.4, você pode digitar dica callable:

function foo(callable $callback) {
    call_user_func($callback);
}

[Edit 2] A partir de PHP 7.0, você pode digitar dica bool, float, int e string Isso torna o código na sintaxe válida da pergunta. A partir de PHP 7.1, você pode digitar dica iterable).

77
Alex Howansky

Declarações de tipo (também conhecidas como dicas de tipo em PHP 5) de um tipo string são suportadas em PHP 7).

Os tipos válidos são:

  • Nome da classe/interface (> = PHP 5.0.0);
  • self (> = PHP 5.0.0);
  • array (> = PHP 5.1.0);
  • callable (> = PHP 5.4.0);
  • bool, float, int, string (> = PHP 7.0.0);
  • iterável - um array ou uma instância de Traversable (> = PHP 7.1.0).
4
kenorb

É uma questão de tempo de compilação versus valores de tempo de execução. Na compilação, apenas valores literais (cadeias, números, booleanos e NULL) são permitidos. O processador PHP $ não pode saber sobre todas as classes possíveis no momento) e, portanto, não é possível criar uma instância de um objeto nos argumentos da função.

O que estou esperando do trecho é que, ao passar normalmente NULL para uma função sugerida por tipo, será gerada uma Exceção/Erro. Se você definir um padrão como NULL, ele não emitirá essa exceção se NULL for passado. Eu não testei, exatamente o que eu esperaria.

1
Chris