Khi bạn đang gọi một hàm hoặc phương thức có (các) đối số, không phải lúc nào bạn cũng biết loại đối số nào (mảng, đối tượng, chuỗi, v.v.) để truyền vào hàm. Và nếu cuối cùng bạn chuyển sai loại, bạn sẽ nhận được một lỗi không hữu ích
Để khắc phục điều này, bạn có thể sử dụng gợi ý loại để cải thiện độ rõ ràng của mã và cải thiện lỗi. Gợi ý kiểu cho phép bạn chỉ định các kiểu dữ liệu mà bạn mong đợi cho một đối số cho một khai báo hàm. Bạn có thể chỉ định các loại dữ liệu như mảng, đối tượng và giao diện. Gợi ý kiểu là tùy chọn, nhưng nó giúp gỡ lỗi mã của bạn dễ dàng hơn và cho phép IDE của bạn cung cấp tính năng tự động hoàn thành cùng với các lợi ích khác
Xét ví dụ đơn giản sau
<?php $ingredients = array('banana', 'strawberry'); function shake ($ingredients) { foreach($ingredients as $ingredient) { print $ingredient; } } shake($ingredients);Điều này sẽ in chuối và dâu ra màn hình
Nhưng không rõ ngay rằng đối số $ingredients trong hàm shake phải là một mảng. Vậy điều gì xảy ra nếu bạn chuyển vào một chuỗi?
$ingredients = 'coconut'; function shake ($ingredients) { foreach($ingredients as $ingredient) { print $ingredient; } } shake($ingredients);Bạn sẽ nhận được lỗi sau
Cảnh báo. Đối số không hợp lệ được cung cấp cho foreach()
Lỗi đang tham chiếu foreach vì bạn đã cố truyền cho nó một chuỗi khi nó đang mong đợi một mảng
Để sử dụng gợi ý kiểu với ví dụ này, hãy thêm kiểu ngày vào đối số hàm. Trong trường hợp này, kiểu dữ liệu là mảng
function shake (array $ingredients) { foreach($ingredients as $ingredient) { print $ingredient; } }Sau đó, nếu bạn chuyển vào chuỗi, bạn sẽ nhận được một lỗi có ý nghĩa hơn
$ingredients = 'coconut'; function shake (array $ingredients) { foreach($ingredients as $ingredient) { print $ingredient; } } shake($ingredients);Lỗi là bây giờ
Lỗi nghiêm trọng có thể bắt được. Đối số 1 được truyền cho shake() phải thuộc kiểu mảng, chuỗi đã cho, được gọi trong /Users/blairwadman/Sites/tutorials/typehinting/index. php trên dòng 13 và được định nghĩa trong /Users/blairwadman/Sites/tutorials/typehinting/index. php trên dòng 7
Điều này rất có ý nghĩa và cho bạn biết chính xác vấn đề là gì và nó đang ở đâu
Gợi ý loại đối tượng
Bạn cũng có thể chỉ định một lớp hoặc giao diện làm gợi ý kiểu
Xem xét triển khai Drupal sau đây của hook_form_alter()
<?php /** * Implements hook_user_login($account). * * @param $account */ function welcome_user_login($account) { $name = $account->getDisplayName(); drupal_set_message(t('Hello @name, thank you for logging in and welcome!', ['@name' => $name])); }Bây giờ bạn có tên hiển thị từ tài khoản $. Nhưng bạn phải biết rằng getDisplayName() là một phương thức khả dụng
May mắn thay, có một cách dễ dàng hơn nếu bạn sử dụng gợi ý kiểu và một IDE như PHPStorm
Nếu bạn bao gồm một lớp cơ sở hoặc giao diện cho biến $account, IDE của bạn sẽ cho bạn biết các phương thức và thuộc tính có sẵn
Thêm gợi ý kiểu 'AccountInterface' vào hàm welcome_user_login()
function welcome_user_login(\Drupal\Core\Session\AccountInterface $account) {Và bây giờ khi bạn bắt đầu nhập $account-> , IDE sẽ cung cấp cho bạn tính năng tự động hoàn thành
Thêm một tuyên bố sử dụng
Bạn cũng có thể bao gồm một tuyên bố sử dụng trong tệp $ingredients = 'coconut'; function shake ($ingredients) { foreach($ingredients as $ingredient) { print $ingredient; } } shake($ingredients); 4 để bạn có thể tham khảo 'AccountInterface' thay vì hệ thống phân cấp không gian tên đầy đủ
Ở đầu tệp $ingredients = 'coconut'; function shake ($ingredients) { foreach($ingredients as $ingredient) { print $ingredient; } } shake($ingredients); 4, hãy thêm câu lệnh sử dụng sau
use Drupal\user\AccountInterface;Thay đổi đối số chức năng
function welcome_user_login(AccountInterface $account) {Đặt tất cả những thứ này lại với nhau, welcome_user_login() hiện là
________số 8kết thúc
Sử dụng gợi ý kiểu trong mã của bạn giúp mã rõ ràng hơn và ít bị lỗi hơn, cải thiện các lỗi bạn gặp phải và cũng hỗ trợ tự động hoàn thành. Gợi ý kiểu chưa phải là một phần của tiêu chuẩn mã Drupal (vì vậy chúng không bắt buộc đối với mã lõi và mã được đóng góp), nhưng bạn có thể tìm thấy rất nhiều ví dụ trong mã lõi
Gợi ý kiểu là khai báo kiểu cho đối số hàm, giá trị trả về và thuộc tính lớp. PHP đảm bảo giá trị thuộc cùng loại mà bạn đã khai báo hoặc ném TypeError. Không bắt buộc nhưng rất hữu ích để bắt lỗi và hữu ích cho những người khác đọc mã của bạn để hiểu điều gì đang xảy ra
đối số chức năng
Để gõ gợi ý thông báo đối số chức năng của chúng tôi về lỗi phương thức của chúng tôi, chúng tôi sẽ thêm chuỗi ngay trước đối số của chúng tôi
<?php class Logger { private $message; function alert(string $message) { return $this->message; } } $logger = new Logger; $logger->alert('Wrong password');
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Điều này đảm bảo rằng bất cứ thứ gì được truyền vào phương thức của chúng ta, $ingredients = 'coconut'; function shake ($ingredients) { foreach($ingredients as $ingredient) { print $ingredient; } } shake($ingredients); 6 luôn là một loại chuỗi hoặc một lỗi được đưa ra
Giá trị trả về
Điều này cũng làm việc cho phản ứng của chúng tôi. Trong trường hợp này, chúng tôi hy vọng phương thức của chúng tôi sẽ trả về một chuỗi và vì vậy chúng tôi thêm $ingredients = 'coconut';
function shake ($ingredients) {
foreach($ingredients as $ingredient) {
print $ingredient;
}
}
shake($ingredients);
7 sau đối số của chúng tôi
$ingredients = 'coconut'; function shake ($ingredients) { foreach($ingredients as $ingredient) { print $ingredient; } } shake($ingredients); 0
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Bất cứ điều gì chúng ta sẽ chuyển đến phương thức lỗi của mình dưới dạng đối số (chuỗi, số nguyên, boolean, mảng, v.v. ), lợi nhuận của chúng tôi phải luôn là một loại chuỗi nếu không sẽ xảy ra lỗi
Thuộc tính lớp
Bên cạnh các phương thức, chúng ta cũng có thể gõ gợi ý các thuộc tính của mình. Trong trường hợp tin nhắn của chúng tôi, chúng tôi thêm chú thích $ingredients = 'coconut';
function shake ($ingredients) {
foreach($ingredients as $ingredient) {
print $ingredient;
}
}
shake($ingredients);
8
$ingredients = 'coconut'; function shake ($ingredients) { foreach($ingredients as $ingredient) { print $ingredient; } } shake($ingredients); 1
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Điều này đảm bảo rằng bất cứ khi nào chúng ta gọi thuộc tính này thì nó phải là một loại chuỗi hoặc một lỗi được đưa ra
Tất cả các loại gợi ý với nhau
Nếu chúng tôi lưu các thông báo ghi nhật ký trong cơ sở dữ liệu của mình và chúng tôi muốn tạo getters và setters cho thông báo của mình, chúng tôi có thể sử dụng cả 3 loại gợi ý loại như sau
$ingredients = 'coconut'; function shake ($ingredients) { foreach($ingredients as $ingredient) { print $ingredient; } } shake($ingredients); 2
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Tôi đã gõ gợi ý thuộc tính $ingredients = 'coconut'; function shake ($ingredients) { foreach($ingredients as $ingredient) { print $ingredient; } } shake($ingredients); 6, đối số là chuỗi và thêm kết quả mong đợi là một chuỗi cho phương thức function shake (array $ingredients) { foreach($ingredients as $ingredient) { print $ingredient; } } 0. Đối với phương pháp function shake (array $ingredients) { foreach($ingredients as $ingredient) { print $ingredient; } } 1, tôi đã thêm kết quả dự kiến là $ingredients = 'coconut'; function shake ($ingredients) { foreach($ingredients as $ingredient) { print $ingredient; } } shake($ingredients); 00. Điều này có nghĩa là chúng tôi không mong đợi bất cứ điều gì cho phương pháp này, điều này là do trình thiết lập sẽ chỉ đặt thuộc tính của chúng tôi và không trả lại cho chúng tôi bất kỳ thứ gì
Loại phương pháp gợi ý
Một số cũng sẽ gõ gợi ý các phương thức của họ, tương tự như thuộc tính của chúng ta, nhưng điều này là không cần thiết vì chúng ta đã gõ gợi ý thuộc tính, đối số và phản hồi của mình