2013-03-26 27 views
56

Sau nhiều năm hạnh phúc được viết mã trong notepad ++ và tuyệt vời, tôi đã khuyên bạn nên cung cấp một IDE PHP. Tôi đang thử phpStorm và nó có vẻ tốt đẹp. Hoàn thành mã và tài liệu là một tính năng tuyệt vời nhưng không hoạt động đối với tôi khi các phương pháp ma thuật được sử dụng. Có một công việc xung quanh để có được phpStorm để hiểu những gì đang xảy ra trong các phương pháp ma thuật?Cách viết các phương thức ma thuật (_call và _callStatic) cho các IDE

tình hình của chúng tôi là một cái gì đó như thế này:

abstract class a { 
    public static function __callStatic($method,$args) 
    { 
     if(strpos($method,"get_by_") === 0) 
     { 
      //do stuff 
     } elseif(strpos($method,"get_first_by_") === 0) { 
      //do stuff 
     } elseif($method == "get_all") { 
      //do stuff 
     } 
    } 
} 

class b extends a { 
    // some more stuff 
} 

b::get_by_user_id(27); 
b::get_first_by_id(156); 
b::get_all(); 

Phương pháp callStatic ma thuật cho phép chúng tôi để có được một bộ sưu tập của các đối tượng thông qua 1 hay nhiều đối số tạo nên gọi hàm.

Tôi thấy rằng có một câu lệnh @method để sử dụng trong những trường hợp này nhưng phpStorm chỉ chọn lên đầu tiên của các câu lệnh này. Hơn nữa tôi chỉ có thể thiết lập kiểu trả về thành hỗn hợp khi tôi muốn có thể thiết lập nó như bất cứ lớp nào mà nó được gọi là (b trong ví dụ của tôi).

Bất kỳ ý tưởng hoặc đề xuất nào cũng sẽ rất biết ơn, cảm ơn.

+1

TẠI SAO NÊN NÓI CHỌN R THNG R ONG ĐIỀU KIỆN '_call' LÀ MỘT Ý TƯỞNG TỐT? !! –

+0

Phải nói, đã +1 nhận xét của Brian trong trường hợp mọi người sane sẽ tìm câu hỏi này. Các phương thức ma thuật dành cho tất cả các ý định và mục đích: không thể ghi lại được (cố gắng ghi lại một tham số (n) [tham số | điều kiện tiên quyết | postcondtion | exception] với một phương thức ma thuật), chứ không phải IDE thân thiện (cố gắng gỡ lỗi một phương pháp ma thuật), khả năng tái cấu trúc (xin vui lòng, thậm chí không xem xét cố gắng để tái cấu trúc một phương pháp ma thuật trong một phần mềm được bảo hiểm), và LAZY (ok, người cuối cùng có thể được hiểu là một ý kiến). –

+4

-1 cho ý kiến ​​trong nhận xét của @ LukeA.Leber vì nó chứng minh sự thiếu tầm nhìn. Trong khi các phương pháp ma thuật không phải là cách để viết ít mã hơn (nếu bạn sử dụng chúng để lười), các phương pháp ma thuật làm cho các kiến ​​trúc có thể đơn giản nếu không có thể hoặc sẽ phức tạp đến nỗi nó sẽ không đáng để viết. Và chúng hoàn toàn thân thiện với IDE khi sử dụng PHPDoc. Lưu ý rằng hầu hết thời gian bạn không cần các phương pháp ma thuật, nhưng khi bạn cần chúng không có thay thế (bằng PHP.) Khi chúng được sử dụng một cách rất có cấu trúc sử dụng chúng là một giải pháp hợp lệ hoàn thành. – MikeSchinkel

Trả lời

102

Sử dụng lớp cấp PHPDoc bình luận - đặc biệt @method thẻ - hoạt động tốt trong PhpStorm:

/** 
* @method static someClass get_by_user_id(int $id) Bla-bla 
* @method static someClass get_first_by_id(int $id) 
*/ 
abstract class a { 
... 

Ở phía trên:

  • @method - thẻ PHPDoc
  • static - cho biết đây là phương pháp tĩnh
  • someClass hoặc $this - kiểu trả
  • get_by_user_id - Phương pháp tên
  • (int $id) - Phương pháp chữ ký: ([[type] [parameter]<, ...>])
  • Bla-bla - một số mô tả tùy chọn

Thông tin thêm về @method:

P.S. Trong khi @method static hoạt động tốt trong PhpStorm (nói với IDE rằng phương thức là tĩnh) có thể không (chưa?) Được hỗ trợ bởi công cụ phpDocumentor thực tế (xin lỗi, đã không sử dụng nó một lúc).


Ngoài ra: (trong PhpStorm, tất nhiên) Settings | Inspections | PHP | Undefined | Undefined method --> Downgrade severity if __magic methods are present in class - nó sẽ không giúp đỡ hoàn thành mã cho các phương pháp như vậy trong bất kỳ cách nào, nhưng sẽ không đánh dấu những phương pháp kỳ diệu như lỗi "phương pháp xác định".vé


phpDocumentor của liên quan đến sử dụng RegEx/tên một phần cho @property/@method thẻ (làm thế nào nó có thể hữu ích cho các tài liệu và làm thế nào chút giúp đỡ nó có thể mang đến cho IDE thực tế khi đối phó với hoàn code):

+1

Cảm ơn, điều này trông giống như một gợi ý hợp lý và nó chắc chắn hoạt động trong phpStorm, nhưng tôi hơi bực mình khi viết ra hàng trăm dòng có khả năng @method ở đầu mỗi lớp. Bạn thấy phương thức get_by_ * có thể được thêm vào bởi bất kỳ tham số đối tượng nào để nhận các đối tượng kiểu đó theo tham số đã chỉ định. Thậm chí loại trừ khả năng get_by _ * _ và_ * tôi sẽ kết thúc với khoảng 1500 '@ methods' trên 140 lớp khác nhau. Có cách nào không chung chung hơn để cung cấp tài liệu không? –

+0

Không. Tất cả các phương pháp ma thuật phải được khai báo cụ thể (đó là điểm chính của việc ghi lại theo cách này) - PHPDoc không hiểu tên một phần (ví dụ: 'get_by _ * (int $ id)'). Đối với IDE (kiểm tra mã, không hoàn thành!), Bạn có giải pháp alt (vô hiệu hóa cảnh báo). Đối với phpDocumentor (hoặc công cụ thay thế) - không có giải pháp được biết đến với tôi (có thể nó là có, nhưng tôi không biết về nó). Bạn có liên kết đến github - gửi vé mới và yêu cầu thêm chức năng phù hợp "một phần tên" - xem những gì họ sẽ nói (rất có thể sẽ bị từ chối). Nếu nó sẽ được thực hiện, thì IDE có thể có nó sau này. – LazyOne

+0

https://github.com/phpDocumentor/phpDocumentor2/issues - nhưng vui lòng kiểm tra xem vé tương tự có tồn tại hay không trước khi đăng. – LazyOne

3

Hơi liên quan đến câu hỏi ban đầu:

Bạn cũng có thể xác định điều này trong tệp meta phpstorm. Dưới đây là ví dụ về phương pháp nhà máy (v2016.3):

// Define in .phpstorm.meta.php 
namespace PHPSTORM_META { 
    $STATIC_METHOD_TYPES = [ 
     \Factory::create('') => [], 
    ]; 
} 

// Then use in code 
$factory = new \Factory(); 
$user = $factory->create(\User::class); 
// Here you get autocomplete. 
$user->subscribe(); 

Bằng cách này bạn không cần phải bỏ qua mọi khả năng xảy ra ma thuật.

Có một số docs để biết chi tiết.

+0

Tính năng này không hoạt động với __call. Nó cũng không phải là tài liệu và PHP không hợp lệ. PHPStorm chỉ cung cấp hỗ trợ cho nơi bạn có các phương thức được xác định tĩnh trả về một hỗn hợp các kiểu tùy thuộc vào đầu vào. – jgmjgm

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