2016-07-11 18 views
13

Tôi đang gặp khó khăn khi gói đầu về tầm quan trọng của Loại gợi ý trong PHP.Tại sao loại gợi ý cần thiết trong PHP?

Rõ ràng 'loại gián tiếp' trong PHP có thể được định nghĩa như sau:

"Type hinting" forces you to only pass objects of a particular type. This prevents you from passing incompatible values, and creates a standard if you're working with a team etc.

Vì vậy, gõ gợi ý ở mức độ cơ bản nhất, không cần phải thực sự làm công việc mã?

Tôi có đoạn code sau để thử và hiểu những gì đang xảy ra ...

index.php

<?php 
include 'Song.php'; 

$song_object = new Song; 

$song_object->title = "Beat it!"; 
$song_object->lyrics = "It doesn't matter who's wrong or right... just beat it!"; 


function sing(Song $song) 
{ 
    echo "Singing the song called " . $song->title; 
    echo "<p>" . $song->lyrics . "</p>"; 
} 

sing($song_object); 

Song.php

<?php 

class Song 
{ 
    public $title; 
    public $lyrics; 
} 

sự mã làm điều của nó có hoặc không có gợi ý loại nhỏ trong hàm sing();

enter image description here

Vì vậy, điều này dẫn tôi để tin rằng loại gián tiếp chỉ đơn giản là một quy ước mã hóa để đảm bảo các lớp học nhất định được sử dụng và không cần thiết để sản xuất mã chức năng, điều này có đúng không?

Nhập gợi ý, như báo giá ở trên gợi ý, có để tạo tiêu chuẩn nếu bạn đang làm việc với một nhóm.

Tôi có thiếu gì đó ở đây không?

+1

có, thats it ... –

+0

Wow, và ở đây tôi đang cố gắng để làm cho nó phức tạp hơn sau đó nó được. Cảm ơn! –

+1

Loại gợi ý giúp bạn nắm bắt lỗi nhanh chóng bằng cách phàn nàn khi bạn truyền một tham số, nó không thể chấp nhận thay vì chấp nhận nó và sau đó ném các lỗi bí ẩn khi nó cố gắng sử dụng nó như một đối tượng kiểu X. loại Y. – apokryfos

Trả lời

13

Loại gián tiếp là không cần thiết, nhưng nó có thể cho phép bạn nắm bắt một số loại lỗi nhất định. Ví dụ: bạn có thể có hàm hoặc phương thức yêu cầu số nguyên. PHP sẽ happily convert "tìm chuỗi số" thành số nguyên và điều này có thể gây khó khăn cho hành vi gỡ lỗi. Nếu bạn chỉ định trong mã của bạn mà bạn đặc biệt cần một số nguyên, điều này có thể ngăn chặn những loại lỗi ở nơi đầu tiên. Nhiều lập trình viên xem xét việc bảo vệ mã của họ theo cách này để trở thành phương pháp hay nhất.

Là một ví dụ cụ thể về điều này trong hành động, chúng ta hãy nhìn vào một phiên bản cập nhật của index.php tập tin của bạn:

index.php

<?php 
include 'Song.php'; 
include 'Test.php'; 

$song_object = new Song; 
$test_object = new Test; 

$song_object->title = "Beat it!"; 
$song_object->lyrics = "It doesn't matter who's wrong or right... just beat it!"; 

$test_object->title = "Test it!"; 
$test_object->lyrics = "It doesn't matter who's wrong or right... just test it!"; 


function sing(Song $song) 
{ 
    echo "Singing the song called " . $song->title; 
    echo "<p>" . $song->lyrics . "</p>"; 
} 

sing($song_object); 
sing($test_object); 

Cũng như các tập tin mới Test.php tôi đã thêm:

Kiểm tra.php

<?php 

class Test 
{ 
    public $title; 
    public $lyrics; 
} 

Khi tôi chạy index.php bây giờ, tôi nhận được thông báo lỗi sau:

Output:

Singing the song called Beat it!<p>It doesn't matter who's wrong or right... 
just beat it!</p>PHP Catchable fatal error: Argument 1 passed to sing() must 
be an instance of Song, instance of Test given, called in test/index.php on 
line 22 and defined in test/index.php on line 15 

Catchable fatal error: Argument 1 passed to sing() must be an instance of 
Song, instance of Test given, called in test/index.php on line 22 and defined 
in test/index.php on line 15 

này được PHP cho tôi biết rằng tôi đã cố gắng để sử dụng các loại sai của lớp khi tôi gọi hàm sing().

1

Loại gợi ý giống như tên cho biết thêm gợi ý. Nó cho phép các nhà phát triển xem các lớp nào có thể được chuyển làm các đối số và ngăn cản chúng vượt qua các đối số sai. Thats đặc biệt hữu ích nếu bạn đang làm việc trên cùng một dự án với nhiều hơn chỉ một người và/hoặc mã có nghĩa là cho nguồn mở.

Trong loại php7 gián tiếp cho string, int, (hỗn hợp) và mảng đã được thêm vào, do đó bạn không cần phải chỉ lớp học nhưng cũng có thể sử dụng các loại php chuẩn

1

Mã của bạn sẽ chạy tốt có hoặc không có gợi ý loại.

Một gợi ý loại đơn giản buộc bạn phải chuyển một thứ gì đó của một loại cụ thể cho hàm/phương thức đó.

Ví dụ:

function displayNames($names) 
{ 
    foreach ($names as $n) { 
     echo $n; 
    } 
} 

Chức năng này sẽ hoạt động tốt khi giả sử người dùng chuyển vào một mảng như sau.

displayNames(array('Tom', 'John', 'Frank')); 

Tuy nhiên, PHP sẽ cho phép người sử dụng để vượt qua bất cứ điều gì, chẳng hạn như một chuỗi, int, bool, đối tượng, vv Không ai trong số những sẽ hành động như thế nào bạn mong đợi khi nó đạt đến foreach bên trong displayNames chức năng .

Thêm gợi ý loại array thực thi thực tế là chức năng này mong đợi $names là một mảng.

function displayNames(array $names) 
{ 
    // We now KNOW that $names is an array. 
    foreach ($names as $n) { 
     echo $n; 
    } 
} 

Mảng là ví dụ dễ dàng, nhưng như bạn đã nói, bạn cũng có thể nhập đối tượng gợi ý. Trong trường hợp đó, nó cho phép nhà phát triển chỉ chấp nhận một cá thể của một kết nối cơ sở dữ liệu trong một phương thức doSqlQuery() chẳng hạn.

Bạn nên biết

phiên bản PHP dưới 7 CHỈ phép gợi ý kiểu cho lớp học (bao gồm cả giao diện), và mảng. Để nhập gợi ý cho string, int, bool, v.v ... bạn cần phải sử dụng PHP 7.

2

Loại gợi ý là quá trình tự nhiên. Lúc đầu, nó có vẻ giống như công việc phụ nhưng nó rất hữu ích khi dự án của bạn phát triển trong PHP. Nó cho phép dễ đọc hơn và kiểm soát lỗi và các quy ước lập trình chặt chẽ dễ áp ​​dụng hơn. Ví dụ:

$song = (object) new Song; 

$song->title = (string) "Beat it!"; 
$song->lyrics = (string) "It doesn't matter who's wrong or right... just beat it!"; 


function sing(SongInterface $song): string 
{ 
    $html = (string) "Singing the song called " . $song->title 
    . "<p>" . $song->lyrics . "</p>"; 

    return htmlentities($html, ENT_QUOTES, 'utf-8'); 
} 

echo sing($song); 

Sử dụng giao diện, bạn chỉ xác định các chức năng và sau đó triển khai nó trong lớp bài hát. Bằng cách này, bạn luôn có thể tiêm một lớp bài hát khác (với các chức năng và thay đổi mới hơn) mà không cần phá vỡ ứng dụng của bạn. Kiểm tra giao diện oop: http://php.net/manual/en/language.oop5.interfaces.php

Vì php7, bạn cũng có thể xác định loại trả về của hàm. https://wiki.php.net/rfc/return_types

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