2016-05-13 14 views
7

Tôi muốn xác định hàm PHP 7 có tham số kiểu hỗn hợp. (Những gì tôi muốn là tương đương với một tham số kiểu chung trong C#; nếu có cách tốt hơn để mô phỏng điều đó trong PHP 7, vui lòng cho tôi biết.)PHP 7: Cách sử dụng loại tham số hỗn hợp trong các chức năng của riêng tôi?

Mã của tôi như sau.

<?php 
declare (strict_types = 1);  

function test (mixed $s) : mixed { 
    return $s; 
} 

// Works 
echo gettype ('hello'); 
// Does not work 
echo test ('hello'); 
?> 

Khi tôi chạy mã này, tôi nhận được thông tin sau.

Fatal error: Uncaught TypeError: Argument 1 passed to test() must be an instance of mixed, string given, called in mixed.php on line 11 and defined in mixed.php:4 
Stack trace: 
#0 mixed.php(11): test('hello') 
#1 {main} 
thrown in mixed.php on line 4 

Nếu tôi nhận xét cuộc gọi để kiểm tra(), mã chạy tốt, vì vậy dường như ít nhất cũng được tôi sử dụng loại tham số hỗn hợp trong khai báo chức năng.

Tôi biết các hàm PHP tích hợp như gettype() có thể lấy các tham số hỗn hợp, mặc dù tôi không biết liệu chúng có đang sử dụng nội bộ bằng cách gõ nghiêm ngặt hay không.

Tôi thấy rằng "hỗn hợp" cũng được sử dụng như một loại giả trong PHP documentation, vì vậy tôi có thể hiểu sai mục đích "hỗn hợp" làm từ khóa PHP, nhưng điều tôi thấy ở đây ít nhất là nó là một từ khóa hợp pháp. Tôi chỉ đơn giản là sử dụng nó theo cách nó không được dự định?

Cuối cùng, tôi nhận ra rằng tôi có thể vượt qua tất cả điều này bằng cách không chỉ định kiểu tham số, nhưng tôi muốn nhất quán bằng cách chỉ định tất cả tham số và kiểu trả về của tôi.

Cảm ơn bạn và vui lòng cho tôi biết nếu tôi có thể cung cấp bất kỳ thông tin bổ sung nào.

+2

Có, 'hỗn hợp' không phải là loại thực. Và nhất quán là trực giao với ngữ nghĩa thích hợp ở đây. – mario

+2

Kết hợp FYI không phải là Loại. (http://php.net/manual/en/language.pseudo-types.php) Nó chỉ là một ** loại giả **: một Gợi ý rằng bất kỳ Kiểu nào có thể được chuyển đến hoặc trả về từ một Phương thức ... hoặc có lẽ cho một biến được gõ lỏng lẻo như hỗn hợp vì lý do nào ... Không giống như trong C#, những gì bạn đang cố gắng đạt được có thể phức tạp trong PHP đặc biệt là ** với strict_types được đặt thành true **. Tuy nhiên, bạn có thể đạt được hiệu ứng gần như tương tự mà không cần gõ mạnh mẽ, trong trường hợp đó các phương pháp của bạn có thể chấp nhận bất kỳ loại nào miễn là bạn không cung cấp bất kỳ gợi ý loại nào. Mặc dù đối với các lập trình viên C# chưa tốt nhưng đó là nước ép của PHP ** – Poiz

+1

Cảm ơn bạn rất nhiều Mario và Poiz. Có vẻ như tôi sẽ chỉ giải quyết thêm/* mixed */làm nhận xét. – FSharpN00b

Trả lời

7

FYI hỗn hợp không phải là một loại. (Refer to the Documentation). Nó chỉ là một loại giả: một Gợi ý rằng bất kỳ loại có thể được chuyển tới hoặc trở về từ một phương pháp ... hoặc có lẽ cho một biến được loại lỏng lẻo như trộn vì lý do bất kỳ ...

Không giống như trong C#, những gì bạn đang cố gắng đạt được có thể phức tạp trong PHP đặc biệt là với strict_types được đặt thành true.

Tuy nhiên, bạn có thể đạt được hiệu ứng gần như tương tự mà không cần nhập đúng - trong trường hợp này là Phương thức của bạn có thể chấp nhận bất kỳ Loại nào miễn là bạn không cung cấp bất kỳ Loại gợi ý nào. Mặc dù đối với các lập trình viên C#, điều đó thật tệ - là nước của PHP.

0

Có thể? -operator hoạt động cho điều này cũng như được đề cập trên http://php.net/manual/de/functions.returning-values.php#functions.returning-values.type-declaration

+0

Chào mừng bạn đến với Stack Overflow! Đây là đường biên [câu trả lời chỉ liên kết] (// meta.stackexchange.com/q/8231). Bạn nên mở rộng câu trả lời của mình để bao gồm nhiều thông tin ở đây và chỉ sử dụng liên kết để tham khảo. – FrankerZ

Các vấn đề liên quan