PHP で厳密な型は何をしますか? 質問する

PHP で厳密な型は何をしますか? 質問する

PHP 7 で次の新しい行を見たことがありますが、その意味をきちんと説明している人はいません。Google で検索したところ、投票のようなもので、それを有効にするかどうかについてしか説明されていませんでした。

declare(strict_types = 1);

それは何をするのでしょうか? それは私のコードにどのような影響を与えますか? それを実行する必要がありますか?

何らかの説明があればいいのですが。

ベストアンサー1

からツリーハウスブログ:

PHP 7 では、スカラー型が追加されました。具体的には、int、float、string、bool です。

スカラー型のヒントを追加し、厳密な要件を有効にすることで、より正確で自己文書化された PHP プログラムを作成できるようになることが期待されます。また、コードをより細かく制御できるようになり、コードが読みやすくなります。

デフォルトでは、スカラー型宣言は非厳密です。つまり、型宣言で指定された型と一致するように元の型を変更しようとします。つまり、数値で始まる文字列を float を必要とする関数に渡すと、先頭から数値が取得され、その他すべてが削除されます。int を必要とする関数に float を渡すと、int(1) になります。

デフォルトでは、PHP は可能な場合は間違った型の値を期待されるスカラー型にキャストします。たとえば、文字列を期待するパラメータに整数を与えられた関数は、文字列型の変数を取得します。

厳密な型が無効になっています(評価):

<?php

  function AddIntAndFloat(int $a, float $b) : int
  {
      return $a + $b;
  }

  echo AddIntAndFloat(1.4, '2');
  /*
  * without strict typing, PHP will change float(1.4) to int(1)
  * and string('2') to float(2.0) and returns int(3)
  */

ファイルごとに厳密モードを有効にすることができます。厳密モードでは、型宣言とまったく同じ型の変数のみが受け入れられ、そうでない場合は TypeError がスローされます。このルールの唯一の例外は、浮動小数点数を期待する関数に整数が渡される場合です。内部関数内からの関数呼び出しは、strict_types 宣言の影響を受けません。

厳密モードを有効にするには、 strict_types 宣言とともに宣言ステートメントを使用します。

厳密な型が有効(評価):

<?php declare(strict_types=1);

  function AddIntAndFloat(int $a, float $b): int
  {
      return (string) $a + $b;
  }

  echo AddIntAndFloat(1.4,'2');
  // Fatal error: Uncaught TypeError: Argument 1 passed to AddIntAndFloat() must be of the type int, float given
  echo AddIntAndFloat(1,'2');
  // Fatal error: Uncaught TypeError: Argument 2 passed to AddIntAndFloat() must be of the type float, string given

  // Integers can be passed as float-points :
  echo AddIntAndFloat(1,1);
  // Fatal error: Uncaught TypeError: Return value of AddIntAndFloat() must be of the type integer, string returned

動作例:

<?php

declare(strict_types=1);

function AddFloats(float $a, float $b) : float
{
    return $a+$b;
}

$float = AddFloats(1.5,2.0); // Returns 3.5

function AddFloatsReturnInt(float $a, float $b) : int
{
    return (int) $a+$b;
}

$int = AddFloatsReturnInt($float,1.5); // Returns 5

function Say(string $message): void // As in PHP 7.2
{
    echo $message;
}

Say('Hello, World!'); // Prints "Hello, World!"

function ArrayToStdClass(array $array): stdClass
{
    return (object) $array;
}

$object = ArrayToStdClass(['name' => 'azjezz','age' => 100]); // returns an stdClass

function StdClassToArray(stdClass $object): array
{
    return (array) $object;
}

$array = StdClassToArray($object); // Returns array

function ArrayToObject(array $array): object // As of PHP 7.2
{
    return new ArrayObject($array);
}

function ObjectToArray(ArrayObject $object): array
{
    return $object->getArrayCopy();
}

var_dump( ObjectToArray( ArrayToObject( [1 => 'a' ] ) ) ); // array(1 => 'a');

おすすめ記事