Các kiểu kết hợp trong PHP là gì?

Liên minh là một loại trừu tượng chỉ đơn giản là liệt kê các Loại đối tượng khác. Giá trị của Loại liên kết thực sự là một giá trị của một trong các Loại đối tượng được bao gồm

Viết các kiểu liên kết¶

Trong loại liên kết graphql-php là một thể hiện của

// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
5 [hoặc một trong các lớp con của nó] chấp nhận mảng cấu hình trong một hàm tạo

Một chú thích có dạng

// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
6 là một Loại liên kết.
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
7,
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
8 và
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
9 là tất cả các loại có thể chấp nhận được của loại công đoàn đó

// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
7,
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
8 và
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
9 là mỗi loại nguyên tử

Các loại liên kết có thể được tạo theo một số cách khác nhau, ví dụ như trong các biểu thức bậc ba

function print_each[array | string $in] {
    foreach [[array] $in as $value] {
        echo $value, PHP_EOL;
    }
}
 
print_each[['Bob', 'Joe', 'Levi']]; // ok
print_each['Levi']; // ok
print_each[new stdclass[]]; // TypeError
3 sẽ là một
function print_each[array | string $in] {
    foreach [[array] $in as $value] {
        echo $value, PHP_EOL;
    }
}
 
print_each[['Bob', 'Joe', 'Levi']]; // ok
print_each['Levi']; // ok
print_each[new stdclass[]]; // TypeError
4 hoặc một
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
60. Chúng ta có thể biểu diễn ý tưởng đó bằng Các kiểu kết hợp – vì vậy ________ 561 được nhập là ________ 562. Các loại liên kết đại diện cho tất cả các loại có thể có mà một biến nhất định có thể có

Các hàm dựng sẵn của PHP cũng có trả về kiểu kết hợp -

// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
63 có thể trả về
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
64 trong một số trường hợp,
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
65 trong những trường hợp khác. Chúng tôi đại diện cho loại công đoàn đó với
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
66

PHP có các khai báo kiểu có thể được liên kết với các tham số hàm hoặc giá trị trả về. Các khai báo này thực hiện hai vai trò hữu ích

  • Chúng cho phép công cụ PHP thực thi đúng loại biến được truyền đến hoặc trả về từ một hàm

  • Chúng giúp dễ dàng suy luận về loại nào cần được chuyển đến hoặc có thể được trả về từ một hàm. Cả con người và các công cụ phân tích mã tĩnh đều có thể sử dụng thông tin này để giúp xác định tính chính xác của mã

Đối với rất nhiều hàm trong PHP, mỗi tham số sẽ chỉ là một loại. Tương tự, đối với phần lớn các hàm, giá trị trả về sẽ chỉ thuộc một loại

Tuy nhiên, đối với một số hàm đáng kể, các tham số được chấp nhận hoặc các giá trị trả về có thể có có thể thuộc nhiều loại. Ví dụ, hãy xem xét hàm

// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
2 trong đó giá trị trả về thay đổi dựa trên

  • nếu kim tồn tại nó trả về một số nguyên

  • nếu không tìm thấy kim, trả về false

Trong tài liệu về php. net, hai loại trả về có thể được ghi lại là

// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
3 - tuy nhiên, điều này không thực sự ghi lại các loại trả về có thể có là gì, chỉ có nhiều hơn một loại có thể được trả về

Hiện tại trong mã vùng người dùng khi một tham số cho một hàm có thể là một trong nhiều loại hoặc giá trị trả về từ một hàm có thể là một trong nhiều loại, không thể có thông tin loại nào được cung cấp. Công cụ PHP không thể thực thi bất kỳ loại nào được truyền đến/từ các hàm này và tương tự, những người sử dụng các hàm này không dễ dàng suy luận về các loại được truyền đến/trả về từ các hàm này

RFC này tìm cách giải quyết những hạn chế này

Đề nghị

RFC này đề xuất khả năng xác định nhiều loại có thể cho các loại tham số và trả về. Để xác định 'loại kết hợp', một thanh dọc [OR] được đặt giữa các loại e. g.

// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
0 đại diện cho kiểu kết hợp của số nguyên hoặc boolean. Đối với những 'loại liên kết' này, một giá trị sẽ vượt qua kiểm tra loại nếu giá trị đó sẽ vượt qua bất kỳ loại nào trong liên kết

Ngoài ra, RFC này đề xuất rằng các giá trị

// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
1,
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
2 [xem phần "Đúng/Sai"] và
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
3 [tương đương với loại
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
3; xem phần "Các loại không thể"] sẽ có thể sử dụng được dưới dạng các loại trong cả định nghĩa kiểu tham số và kiểu trả về

Có thể có nhiều hơn hai loại trong liên minh

Ví dụ về loại tham số

Một hàm yêu cầu một chuỗi hoặc một mảng được truyền cho nó dưới dạng tham số

function print_each[array | string $in] {
    foreach [[array] $in as $value] {
        echo $value, PHP_EOL;
    }
}
 
print_each[['Bob', 'Joe', 'Levi']]; // ok
print_each['Levi']; // ok
print_each[new stdclass[]]; // TypeError

Đối với ví dụ này, cả công cụ phân tích tĩnh và con người đều rõ ràng rằng việc chuyển bất kỳ thứ gì khác ngoài mảng hoặc chuỗi vào hàm này sẽ là một lỗi. [hoặc sẽ được truyền yếu thành một chuỗi nếu nghiêm ngặt_types bị vô hiệu hóa, xem thêm phần "Các loại vô hướng yếu"]

Một phương thức thể hiện của lớp yêu cầu một chuỗi hoặc một đối tượng ParameterGenerator được truyền dưới dạng tham số

// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}

Đối với ví dụ này, cả công cụ phân tích tĩnh và con người đều rõ ràng rằng việc chuyển bất kỳ thứ gì khác ngoài đối tượng ParameterGenerator hoặc một chuỗi vào hàm này sẽ là một lỗi

Ví dụ về kiểu trả về

Định nghĩa vùng người dùng của hàm

// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
2

________số 8

Đối với ví dụ này, rõ ràng đối với cả công cụ phân tích tĩnh và con người, hàm này có thể trả về một số nguyên hoặc giá trị 'false' và do đó, cả hai trường hợp đều cần được xử lý trong mã gọi

loại nullable

Để bao quát trường hợp sử dụng phổ biến trả về một số loại hoặc

// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
3, loại
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
3 cần được cho phép trong khai báo loại. Tên đã được đặt trước và tài liệu đã chứng minh rằng
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
3 vừa là loại vừa là giá trị. Trước đây nó không phải là một khai báo kiểu hữu ích - nếu một cái gì đó luôn được truyền vào
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
3 thì không cần phải có một tham số nào cả và nếu một hàm luôn trả về
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
3 thì không cần phải gán nó. Với việc giới thiệu các loại công đoàn, nó trở nên hữu ích và vì vậy RFC này đề xuất cho phép
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
3 trong các công đoàn

// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
5

Điều này hiện có thể thực hiện được thông qua hỗ trợ loại nullable viết tắt

function stripos[string $haystack, string $needle, int $offset = 0]: int|false {
    $lowerHaystack = strtolower[$haystack];
    $lowerNeedle = strtolower[$needle];
    return strpos[$lowerHaystack, $lowerNeedle, $offset];
}
2. Tuy nhiên, một số lo ngại đã được đưa ra

  1. function stripos[string $haystack, string $needle, int $offset = 0]: int|false {
        $lowerHaystack = strtolower[$haystack];
        $lowerNeedle = strtolower[$needle];
        return strpos[$lowerHaystack, $lowerNeedle, $offset];
    }
    3 khá kỳ lạ, nó đọc như “[nullable Foo] hoặc [Bar]” khi tính vô hiệu không được gắn với một loại cụ thể

  2. Cho phép

    function stripos[string $haystack, string $needle, int $offset = 0]: int|false {
        $lowerHaystack = strtolower[$haystack];
        $lowerNeedle = strtolower[$needle];
        return strpos[$lowerHaystack, $lowerNeedle, $offset];
    }
    4 và
    function stripos[string $haystack, string $needle, int $offset = 0]: int|false {
        $lowerHaystack = strtolower[$haystack];
        $lowerNeedle = strtolower[$needle];
        return strpos[$lowerHaystack, $lowerNeedle, $offset];
    }
    5 là dư thừa

  3. function stripos[string $haystack, string $needle, int $offset = 0]: int|false {
        $lowerHaystack = strtolower[$haystack];
        $lowerNeedle = strtolower[$needle];
        return strpos[$lowerHaystack, $lowerNeedle, $offset];
    }
    4 rõ ràng hơn
    function stripos[string $haystack, string $needle, int $offset = 0]: int|false {
        $lowerHaystack = strtolower[$haystack];
        $lowerNeedle = strtolower[$needle];
        return strpos[$lowerHaystack, $lowerNeedle, $offset];
    }
    5. Người dùng không quen thuộc với
    function stripos[string $haystack, string $needle, int $offset = 0]: int|false {
        $lowerHaystack = strtolower[$haystack];
        $lowerNeedle = strtolower[$needle];
        return strpos[$lowerHaystack, $lowerNeedle, $offset];
    }
    8 trong các ngôn ngữ khác có thể hiểu rõ hơn về
    function stripos[string $haystack, string $needle, int $offset = 0]: int|false {
        $lowerHaystack = strtolower[$haystack];
        $lowerNeedle = strtolower[$needle];
        return strpos[$lowerHaystack, $lowerNeedle, $offset];
    }
    9

Để giải quyết một số vấn đề này, RFC này không cho phép sử dụng

function stripos[string $haystack, string $needle, int $offset = 0]: int|false {
    $lowerHaystack = strtolower[$haystack];
    $lowerNeedle = strtolower[$needle];
    return strpos[$lowerHaystack, $lowerNeedle, $offset];
}
8 kết hợp với các loại liên kết. Do đó,
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
51 được phép, nhưng không cho phép
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
52

RFC này đề xuất một cuộc bỏ phiếu về việc liệu

function stripos[string $haystack, string $needle, int $offset = 0]: int|false {
    $lowerHaystack = strtolower[$haystack];
    $lowerNeedle = strtolower[$needle];
    return strpos[$lowerHaystack, $lowerNeedle, $offset];
}
5 có được thay thế bằng
function stripos[string $haystack, string $needle, int $offset = 0]: int|false {
    $lowerHaystack = strtolower[$haystack];
    $lowerNeedle = strtolower[$needle];
    return strpos[$lowerHaystack, $lowerNeedle, $offset];
}
4 nói chung hay không

Đúng sai

Có thể hữu ích nếu có thể sử dụng rõ ràng

// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
55 cho các kiểu trả về vì đây là thành ngữ phổ biến trong các hàm tiêu chuẩn của PHP. Ví dụ, chữ ký hàm cho
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
56 có thể thay đổi

// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
1

Điều này hiện cho phép chuyển tiếp hoàn hảo bất kỳ chữ ký nội bộ nào và cho phép người dùng rõ ràng hơn

Ngoài ra,

// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
2 và
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
1 không phải là loại trong vùng đất của người dùng, nhưng chúng là loại bên trong

RFC này đề xuất một cuộc bỏ phiếu để quyết định xem có nên hỗ trợ

// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
1 và
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
2 cho các công đoàn hay không

Các loại vô hướng yếu

Vấn đề

PHP 7 cho phép các loại vô hướng yếu. Có một câu hỏi về cách mọi thứ sẽ được chuyển đổi trong một số tình huống khi được sử dụng trong các hiệp hội. Ví dụ: nếu chúng ta có một loại liên kết của

// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
11 và
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
12 và được truyền chuỗi “10” thì nó được chuyển đổi như thế nào?

// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
8

Nó sẽ được chuyển đổi thành

// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
13 hoặc
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
14, vì cả hai đều được chấp nhận?

Dung dịch

Về cơ bản, vấn đề này sẽ tránh được nếu loại tham số khớp chính xác với loại đầu vào hoặc nếu PHP ở chế độ loại nghiêm ngặt

Với ngoại lệ duy nhất là một

// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
13 được chuyển đến một tham số yêu cầu float là một trong các loại của nó, nhưng không phải là
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
11 [e. g.
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
17], theo cách xử lý thông thường của các số nguyên được truyền cho số float, sẽ bị ép buộc thành
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
14

Mặt khác, các quy tắc truyền của PHP được áp dụng theo thứ tự không mất dữ liệu nhất có thể. Quy tắc truyền kiểu yếu của PHP rất phức tạp, dẫn đến một bộ quy tắc có vẻ phức tạp cho kiểu truyền, tuy nhiên những quy tắc này không phải là phát minh của đề xuất này. RFC này áp dụng các quy tắc truyền PHP theo cách lành mạnh để chuyển đổi giá trị thành loại được liên minh chấp nhận bất cứ khi nào có thể

Đã vượt qua loạiUnion type #1#2#3objectstring [

// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
19]--booleanintfloatstringintfloat*stringbooleanfloatstringintbooleanstringint/float†boolean-

* Mặc dù chuỗi mất dữ liệu nhiều hơn float đối với các giá trị lớn, nhưng chúng tôi phải khớp hành vi với các loại nghiêm ngặt được bật tại đây
† chỉ khi

// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
80 trả về true
Respecting the order, for each type check if it is available in the union, else throw a
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
81 if none is available.

Các vấn đề với trái sang phải

Chuyển đổi từ trái sang phải đã được đề xuất nhiều lần. Nhưng đây không phải là một giải pháp khả thi vì những lý do sau

  • [sợi dây. float] sẽ chuyển đổi thành một chuỗi nếu được truyền vào một số nguyên, điều này sẽ không phù hợp với các kiểu nghiêm ngặt khi chuyển đổi nó thành một số float. Loại mâu thuẫn này phải được tránh

  • Ngoài ra, trong trường hợp nghiêm ngặt từ trái sang phải, các kết quả khớp chính xác sẽ vẫn được chuyển sang loại đầu tiên [từ bên trái] mà chúng có thể được chuyển sang. Điều này một lần nữa sẽ không phù hợp với các loại nghiêm ngặt được kích hoạt

  • Cuối cùng, [phao. int] sẽ, ngay cả trong chế độ loại nghiêm ngặt, dẫn đến chuyển đổi thành float trong mọi trường hợp khi truyền số nguyên;

Có thể miễn trừ các đối sánh chính xác, nhưng sau đó chúng tôi có một quy tắc khác và vẫn là vấn đề đầu tiên trong danh sách trên. Tại thời điểm đó, việc có thứ tự chuyển đổi được xác định rõ ràng tùy thuộc vào loại đã chuyển sẽ đơn giản hơn nhiều

phương sai

Các kiểu trả về là hiệp biến. có thể xóa các loại khỏi liên kết trong các hàm con

Các loại tham số là trái ngược nhau. có thể thêm các loại vào liên kết trong các chức năng con

// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
8

Sự phản xạ

RFC này đề xuất bổ sung một lớp

// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
82 kế thừa từ
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
83 bằng một phương thức duy nhất
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
84 để lấy các lớp phản chiếu của các kiểu riêng lẻ trong liên kết

// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
85 bây giờ sẽ cung cấp một kiểu kết hợp đầy đủ dưới dạng chuỗi; . g.
// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
86

[Các] Phiên bản PHP được đề xuất

RFC này nhắm mục tiêu phiên bản PHP 7. 1

Bỏ phiếu

RFC này yêu cầu hai phần ba cử tri bỏ phiếu ủng hộ RFC để thông qua

Ngoài ra, có hai phiếu bầu 50%+1

Cuộc bình chọn bắt đầu từ ngày 14 tháng 6 năm 2016 và sẽ kết thúc vào ngày 23 tháng 6 năm 2016

Các bản vá lỗi và thử nghiệm

Phạm vi tương lai

Phần này trình bày chi tiết các khu vực mà tính năng này có thể được cải thiện trong tương lai nhưng hiện không được đề xuất trong RFC này

Biểu thức kiểu dài

Vì bạn có thể tạo một chuỗi các loại nên tên có thể khá dài. Ngay cả kiểu kết hợp khá ngắn của

// From zend-code
class MethodGenerator extends AbstractMemberGenerator {
     ...
    public function setParameter[ParameterGenerator|string $parameter] {
        ...
    }
}
87 cũng có thể được lặp đi lặp lại để loại ra. Có nên tồn tại cơ chế cung cấp bí danh loại không?

Công đoàn và các loại là gì?

Công đoàn có bốn chức năng chính liên quan đến phúc lợi của đoàn viên, củng cố công đoàn, tiến hành các hoạt động của công đoàn và đóng góp cho xã hội. Công đoàn có ba loại, cụ thể là công đoàn thủ công, công đoàn công nghiệp và công đoàn chung .

Khai báo biến kiểu kết hợp là gì?

Một "khai báo liên kết" chỉ định một tập hợp các giá trị biến và, tùy chọn, một thẻ đặt tên cho liên kết . Các giá trị biến được gọi là "thành viên" của liên minh và có thể có các loại khác nhau. Công đoàn tương tự như "bản ghi biến thể" trong các ngôn ngữ khác.

Loại hỗn hợp trong PHP là gì?

hỗn hợp là một loại giả được thêm vào trong PHP 8 truyền đạt loại tham số/trả về/thuộc tính có thể thuộc bất kỳ loại nào . loại hỗn hợp bao gồm tất cả các loại vô hướng trong PHP, null, tất cả các đối tượng lớp, có thể gọi được và thậm chí cả tài nguyên. hỗn hợp tương đương với Loại Liên minh. sợi dây. int. trôi nổi. bool. vô giá trị. mảng. sự vật. gọi được. nguồn.

các loại giao lộ tinh khiết là gì?

Các loại giao lộ thuần túy là gì? . Việc triển khai Loại giao lộ của 1 được gọi là Loại giao lộ "thuần túy" vì không cho phép kết hợp Loại hợp nhất và Loại giao lộ trong cùng một khai báo . Các loại giao lộ được khai báo bằng cách kết hợp tên lớp/giao diện với dấu &.

Chủ Đề