Nullable 유형
Nullable 유형은 주로 매개변수 유형 선언 및 함수 반환값 선언에 사용됩니다.
주요 두 가지 형식은 다음과 같습니다.
<?phpfunction answer(): ?int { return null; //ok}function answer(): ?int { return 42; // ok}function say(?string $msg) { if ($msg) { echo $msg; }}
예제를 보면 이해하기 쉽습니다. 함수 매개변수의 유형을 나타내기 위해 ? 반환 값은 지정된 유형이거나 null 입니다.
이 방법은 인터페이스 함수 정의에도 사용할 수 있습니다.
<?php interface Fooable { function foo(?Fooable $f);}
그러나 한 가지 주의할 점은 함수 자체가 매개변수 유형을 정의하고 기본값이 없는 경우입니다. , nullable인 경우에도 생략할 수 없습니다. 그렇지 않으면 오류가 발생합니다. 다음과 같습니다:
<?php function foo_nullable(?Bar $bar) {} foo_nullable(new Bar); // 可行foo_nullable(null); // 可行foo_nullable(); // 不可行
그러나 위 함수의 매개변수를 ?Bar $bar = null 형식으로 정의하면 세 번째 작성 방법도 가능합니다. = null은 실제로 ? 의 상위 집합과 동일하므로 null 허용 형식 매개 변수의 경우 null을 기본값으로 설정할 수 있습니다.
list의 대괄호 약어
PHP5.4 이전에는 array()를 통해서만 배열을 정의할 수 있다는 것을 알고 있습니다. 5.4 이후에 추가됨 []의 단순화된 표기(아직도 5자를 생략하는 것이 매우 실용적임).
<?php // 5.4 之前$array = array(1, 2, 3);$array = array("a" => 1, "b" => 2, "c" => 3); // 5.4 及之后$array = [1, 2, 3];$array = ["a" => 1, "b" => 2, "c" => 3];
는 또 다른 질문으로 확장됩니다. 배열의 값을 다른 변수에 할당하려면 목록을 통해 달성할 수 있습니다.
<?php list($a, $b, $c) = $array;
[의 약어를 통해서도 달성할 수 있나요? ] 모직물?
<?php [$a, $b, $c] = $array;
및 다음 기능에서 언급되는 목록 지정 키:
<?php ["a" => $a, "b" => $b, "c" => $c] = $array;
PHP7.1은 이 기능을 구현합니다. 다만, lvalue에 나타나는 []는 array의 약자가 아니고 list()의 약자라는 점에 유의해야 한다.
그러나 이것이 전부는 아닙니다. 새로운 list() 구현은 lvalue에 나타날 수 있을 뿐만 아니라 foreach 루프에서도 사용할 수 있습니다.
<?php foreach ($points as ["x" => $x, "y" => $y]) { var_dump($x, $y);
그러나 구현 문제로 인해 list()와 []를 서로 중첩하여 사용할 수 없습니다.
<?php // 不合法 list([$a, $b], [$c, $d]) = [[1, 2], [3, 4]]; // 不合法 [list($a, $b), list($c, $d)] = [[1, 2], [3, 4]]; // 合法 [[$a, $b], [$c, $d]] = [[1, 2], [3, 4]];
목록에 키를 지정할 수 있습니다
위에서 언급했듯이 new 키는 list() 구현에서 지정할 수 있습니다:
<?php $array = ["a" => 1, "b" => 2, "c" => 3];["a" => $a, "b" => $b, "c" => $c] = $array;
이는
<?php $a = $array['a'];$b = $array['b'];$c = $array['c'];
와 동일합니다. 이전과의 차이점은 list()의 이전 구현이 다음과 동일하다는 것입니다. 키는 0, 1, 2, 3 뿐입니다. 순서는 조정할 수 없습니다. 다음 명령문을 실행하면
<?php list($a, $b) = [1 => '1', 2 => '2'];
오류가 발생합니다. PHP error: Undefine offset: 0... .
새 구현에서는 다음과 같은 방법으로 할당을 조정할 수 있습니다.
<?php list(1 => $a, 2 => $b) = [1 => '1', 2 => '2'];
배열과 달리 목록은 혼합 키를 지원하지 않습니다. 다음 작성은 구문 분석 오류를 유발합니다. >
<?php // Parse error: syntax error, ...list($unkeyed, "key" => $keyed) = $array;
<?php $points = [ ["x" => 1, "y" => 2], ["x" => 2, "y" => 1]]; list(list("x" => $x1, "y" => $y1), list("x" => $x2, "y" => $y2)) = $points; $points = [ "first" => [1, 2], "second" => [2, 1]]; list("first" => list($x1, $y1), "second" => list($x2, $y2)) = $points;
<?php $points = [ ["x" => 1, "y" => 2], ["x" => 2, "y" => 1]]; foreach ($points as list("x" => $x, "y" => $y)) { echo "Point at ($x, $y)", PHP_EOL;}
<?php function should_return_nothing(): void { return 1; // Fatal error: A void function must not return a value}
<?php function lacks_return(): void { // valid} function returns_nothing(): void { return; // valid}
<?php function returns_one(): void { return 1; // Fatal error: A void function must not return a value} function returns_null(): void { return null; // Fatal error: A void function must not return a value}
<?php function foobar(void $foo) { // Fatal error: void cannot be used as a parameter type}
<?php class Foo{ public function bar(): void { } } class Foobar extends Foo{ public function bar(): array { // Fatal error: Declaration of Foobar::bar() must be compatible with Foo::bar(): void }}
이 기능은 상대적으로 간단합니다. 즉, 클래스의 상수는 이제 공개, 비공개 및 보호 수정을 지원합니다.
<?php class Token { // 常量默认为 public const PUBLIC_CONST = 0; // 可以自定义常量的可见范围 private const PRIVATE_CONST = 0; protected const PROTECTED_CONST = 0; public const PUBLIC_CONST_TWO = 0; // 多个常量同时声明只能有一个属性 private const FOO = 1, BAR = 2;}
<?php interface ICache { public const PUBLIC = 0; const IMPLICIT_PUBLIC = 1;}
<?php class testClass { const TEST_CONST = 'test'; } $obj = new ReflectionClass( "testClass" ); $const = $obj->getReflectionConstant( "TEST_CONST" ); $consts = $obj->getReflectionConstants();
<?php try { // Some code... } catch (ExceptionType1 $e) { // 处理 ExceptionType1} catch (ExceptionType2 $e) { // 处理 ExceptionType2} catch (Exception $e) { // ...}
<?php try { // Some code...} catch (ExceptionType1 | ExceptionType2 $e) { // 对于 ExceptionType1 和 ExceptionType2 的处理} catch (Exception $e) { // ...}