2011-08-16 26 views
6

Là một người dùng Emacs, điều duy nhất mà tôi ghen tị với các biên tập viên "hiện đại" như PDT là PDT hiểu các loại và thậm chí cả các gợi ý kiểu PHPDoc "", ví dụ:Trình thông dịch PHP có thể được nhận biết về các gợi ý kiểu PHPDoc không?

/** 
    * @param DateTime $date 
    * @param string $name 
    * @return DOMDocument 
    */ 

Hiện tại tôi sử dụng gợi ý loại ở bất cứ nơi nào có thể để thông dịch viên thông báo cho tôi nếu tôi gặp loại tham số sai, nhưng chỉ hoạt động nếu tham số là đối tượng. Quan trọng hơn, không có cách nào để đảm bảo rằng giá trị trả về của một hàm là một kiểu cụ thể.

Đây có thể là một cảnh quay dài, nhưng có bất kỳ trình cắm hay cách nào khác để làm cho trình thông dịch PHP nhận thức được các nhận xét PHPDoc giống như cách PDT? Lý tưởng nhất, tôi muốn nhận được các lỗi nghiêm trọng nếu tôi trả về một giá trị của loại sai, hoặc nếu tôi vượt qua một chuỗi mà tôi đã tuyên bố tham số như một int, ví dụ.

+0

Giống như câu hỏi nhưng theo như tôi biết câu trả lời là không thể. – MitMaro

+2

PHP có mục đích động và được nhập sai, do đó, cố gắng thực thi các loại sẽ là một trận chiến khó khăn. – erisco

+2

Khám phá [PHPLint] (http://www.icosaedro.it/phplint/) – shesek

Trả lời

1

Không. PHP không hỗ trợ khai báo loại hoặc loại gợi ý rõ ràng, sử dụng type juggling rõ ràng là một phần của trình thông dịch PHP. Theo số documents trên gợi ý kiểu, chỉ các gợi ý kiểu đối tượng và mảng được hỗ trợ.

Điều đó nói rằng, nếu bạn có chức năng với các yêu cầu loại chặt chẽ, nó trở nên cần thiết để xác thực các đối số đó khi bắt đầu một hàm. Nếu bạn rất gắn bó với ý tưởng về các kiểu trong PHP, bạn có thể a) chuyển sang một ngôn ngữ đã gõ (heh), hoặc b) sử dụng một mẫu autoboxing/object-wrapper. Có một buổi biểu diễn hình phạt đáng kể cho điều này, nhưng thay vì sử dụng kiểm tra nguyên thủy cho loại (tức là is_string), bạn có thể tạo lớp wrapper và loại sử dụng gián tiếp:

class StringWrapper { 
    public $value = null; 
    function __construct($val) { 
    $this->value = $val; 
    } 

} 

function requires_a_string(StringWrapper $string_value) { 
echo $string_value->value; 
} 

$string = new StringWrapper('Hello world!'); 

Như bạn có thể thấy, đó là một ngọn đồi khá lớn để leo lên (với việc tạo bao bọc cho từng loại) chỉ để tránh:

function requires_a_string($string_value='') { 
if (!is_string($string_value)) 
    return false; 
echo $string_value; 
} 

Bản án của tôi là: không đáng.

Bạn có thể đọc thêm một số chi tiết về hộp số tự động tại đây: http://php.webtutor.pl/en/2011/04/13/strong-data-typing-in-php-part-ii-autoboxing-and-indestructable-objects-english-version/ Ngoài ra, hãy lưu ý RFC này cho autoboxing: https://wiki.php.net/rfc/autoboxing Đã lâu rồi, vì vậy tôi sẽ không giữ cho nó.

+0

Vâng, tôi cũng không muốn leo lên ngọn đồi đó. Đó là lý do tại sao tôi đã hy vọng rằng một ai đó với quá nhiều thời gian trên tay của họ đã có thể viết một plugin hoặc mô-đun thực hiện công cụ này tự động. Không giống như nó ... –

2

Bạn nên xem xét phần mở rộng SplTypes (chú ý: nó là thử nghiệm). Điều đó cho phép loại gợi ý của "nguyên thủy" (cuối cùng tôi nghe nói họ là tốt hơn so với nguyên thủy trong mọi cách tưởng tượng).

Bạn không thể làm cho lực lượng phiên dịch trở thành nguyên thủy theo bất kỳ cách nào khác, mặc dù có một cách giải quyết khó chịu mà tôi sẽ để lại như một bài tập cho người đọc.

+0

Cần lưu ý rằng phần mở rộng này là thử nghiệm, có thể được giảm bất cứ lúc nào, và có rất nhiều chi phí. Hơn nữa, đây không phải là đánh máy đúng, nhưng đúng hơn là việc thực hiện gói đối tượng. –

+0

Đó là khả năng thú vị, mặc dù tôi phải thừa nhận tôi không phải là một fan hâm mộ lớn của cú pháp $ int = new SplInt (94); Nhưng cùng với gói quá tải của toán tử PECL, nó có thể là một cách giải quyết khác. –

+0

@Chris Cảm ơn bạn đã chỉ ra điều đó. Tôi đã quên (tôi không bao giờ sử dụng nó bản thân mình, tôi chỉ nghĩ rằng nó là mát mẻ). – cwallenpoole

0

Nó được thảo luận lớn như thế nào để làm cho loại gián tiếp với nhiều loại vô hướng:

  • mạnh kiểm tra loại
  • Cố gắng sắp xếp nó luôn luôn
  • Cố gắng sắp xếp nó nếu obivios tức là '123' để int (123) nhưng không phải là '123aaa' to int (123)

nhưng theo như tôi biết bây giờ các nhà phát triển giải pháp để không sử dụng vô hướng kiểu gián tiếp ở tất cả các

PHP manual nói:
Loại Gợi ý chỉ có thể thuộc đối tượng và mảng (kể từ PHP 5.1). Gợi ý kiểu truyền thống với int và chuỗi không được hỗ trợ.

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