values - php string return type




Was machen strenge Typen in PHP? (2)

Ich habe diese neue Zeile in PHP7 gesehen, aber niemand erklärt wirklich, was es bedeutet. Ich habe es gegoogelt und alles, worüber sie reden, ist, ob Sie es aktivieren oder nicht wie eine Umfrage.

declare(strict_types = 1);

Was tut es? Wie wirkt es sich auf meinen Code aus? Sollte ich es machen? Eine Erklärung wäre nett.


Vom Baumhaus-Blog :

Mit PHP 7 haben wir jetzt Skalartypen hinzugefügt. Insbesondere: int, float, string und bool.

Durch das Hinzufügen von skalaren Typhinweisen und das Ermöglichen strenger Anforderungen wird gehofft, dass korrektere und selbstdokumentierende PHP-Programme geschrieben werden können. Außerdem haben Sie mehr Kontrolle über Ihren Code und können den Code leichter lesen.

Standardmäßig sind skalare Typdeklarationen nicht streng, was bedeutet, dass sie versuchen, den ursprünglichen Typ so zu ändern, dass er dem in der Typdeklaration angegebenen Typ entspricht. Mit anderen Worten, wenn Sie eine Zeichenfolge, die mit einer Zahl beginnt, an eine Funktion übergeben, für die ein Gleitkomma erforderlich ist, wird die Zahl von Anfang an erfasst und alles andere entfernt. Das Übergeben eines Floats an eine Funktion, die ein int erfordert, wird zu int (1).

Standardmäßig wandelt PHP, wenn möglich, Werte des falschen Typs in den erwarteten Skalartyp um. Beispielsweise erhält eine Funktion, die eine Ganzzahl für einen Parameter erhält, der eine Zeichenfolge erwartet, eine Variable vom Typ Zeichenfolge.

Strikte Typen deaktiviert ( eval ):

<?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)
  */

Es ist möglich, den strikten Modus auf Dateibasis zu aktivieren. Im strikten Modus wird nur eine Variable des genauen Typs der Typdeklaration akzeptiert oder ein TypeError ausgelöst. Die einzige Ausnahme von dieser Regel besteht darin, dass einer Funktion, die einen Gleitkommawert erwartet, eine Ganzzahl zugewiesen werden kann. Funktionsaufrufe aus internen Funktionen werden von der strict_types-Deklaration nicht beeinflusst.

Um den strikten Modus zu aktivieren, wird die declare-Anweisung mit der strict_types-Deklaration verwendet:

Strikte Typen aktiviert ( eval ):

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

Arbeitsbeispiel:

<?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 on 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');

strict_types beeinflusst den Typenzwang .

Vor strengen Typen bedeutete int $x " $x muss einen Wert haben, der einem int ähnlich ist , aber nicht unbedingt einem int-Wert." Alles, was zu einem int Wert gezwungen werden könnte, würde den Typ-Hinweis übergeben, einschließlich:

  • ein int proper ( 242 ),
  • ein Schwimmer ( 10.17 ),
  • ein Bool ( 1 ),
  • null oder
  • eine Zeichenfolge mit führenden Ziffern ( 13 Ghosts ).

strict_types=1 Sie jetzt strict_types=1 , teilen Sie der Engine mit, dass int "genau und nur ein int korrekt" bedeuten muss. Nichts anderes. Sie haben eine großartige und große Sicherheit, dass Sie genau das bekommen, was Ihnen gegeben wurde, ohne Konvertierung und potenziellen Verlust.

Beispiel:

<?php
function get_quantity(): int {
    return '100 apples';
}
echo get_quantity() . PHP_EOL;

Ergibt ein möglicherweise verwirrendes Ergebnis:

Notice: A non well formed numeric value encountered in /Users/bishop/tmp/pmkr-994/junk.php on line 4
100

Die meisten Entwickler würden, denke ich, einen int Hinweis erwarten, der "nur ein int" bedeutet. Aber es bedeutet "so etwas wie ein Int". Das Aktivieren von strikten Typen führt zu dem erwarteten und gewünschten Verhalten:

<?php declare(strict_types=1);

function get_quantity(): int {
    return '100 apples';
}
echo get_quantity() . PHP_EOL;

Erträge:

Fatal error: Uncaught TypeError: Return value of get_quantity() must be of the type int, string returned in example.php:4

Ich denke, es gibt zwei Lektionen hier, wenn Sie Tipp-Tipps verwenden:

  • Verwenden strict_types=1 immer strict_types=1 .
  • Konvertieren Sie strict_types in Ausnahmen, falls Sie vergessen, das Pragma strict_types hinzuzufügen.




php-7.2