Hướng dẫn php annotation array of objects - mảng chú thích php của các đối tượng

Tôi thích đọc và viết mã sạch - như được nêu trong "Mã sạch" của Robert C. Martin. Khi làm theo sự tín nhiệm của anh ấy, bạn không nên yêu cầu nhà phát triển (với tư cách là người dùng API của bạn) để biết cấu trúc (nội bộ) của mảng của bạn.

Người dùng API có thể hỏi: đó có phải là một mảng chỉ có một chiều không? Là các đối tượng trải rộng trên tất cả các cấp của một mảng đa chiều? Có bao nhiêu vòng lặp lồng nhau (foreach, v.v.) Tôi cần truy cập tất cả các đối tượng? Loại đối tượng nào được "lưu trữ" trong mảng đó?

Khi bạn đã phác thảo, bạn muốn sử dụng mảng đó (có chứa các đối tượng) như một mảng một chiều.

Như Nishi đã phác thảo, bạn có thể sử dụng:

/**
 * @return SomeObj[]
 */

cho điều đó.

Nhưng một lần nữa: Hãy lưu ý - đây không phải là một ký hiệu tài liệu tiêu chuẩn. Ký hiệu này được giới thiệu bởi một số nhà sản xuất IDE.

Được rồi, được rồi, với tư cách là một nhà phát triển, bạn biết rằng "[]" được gắn với một mảng trong PHP. Nhưng "cái gì đó []" có nghĩa là gì trong bối cảnh PHP bình thường? "[]" có nghĩa là: Tạo phần tử mới trong "cái gì đó". Yếu tố mới có thể là tất cả. Nhưng những gì bạn muốn thể hiện là: mảng các đối tượng có cùng loại và loại chính xác của nó. Như bạn có thể thấy, nhà sản xuất IDE giới thiệu một bối cảnh mới. Một bối cảnh mới bạn phải học. Một bối cảnh mới, các nhà phát triển PHP khác phải học (để hiểu các tài liệu của bạn). Phong cách xấu (!).

Bởi vì mảng của bạn có một chiều mà bạn có thể muốn gọi đó là "mảng các đối tượng" là "danh sách". Xin lưu ý rằng "danh sách" có một ý nghĩa rất đặc biệt trong các ngôn ngữ lập trình khác. Ví dụ, sẽ tốt hơn nếu gọi nó là "bộ sưu tập".

Hãy nhớ rằng: bạn sử dụng ngôn ngữ lập trình cho phép bạn tất cả các tùy chọn của OOP. Sử dụng một lớp thay vì một mảng và làm cho lớp học của bạn có thể vượt qua như một mảng. Ví dụ.:

class orderCollection implements ArrayIterator

Hoặc nếu bạn muốn lưu trữ các đối tượng bên trong ở các cấp độ khác nhau trong cấu trúc mảng/đối tượng đa chiều:

class orderCollection implements RecursiveArrayIterator

Giải pháp này thay thế cho mảng của bạn bằng một đối tượng loại "OrderCollection", nhưng không cho phép hoàn thành mã trong IDE của bạn cho đến nay. Được chứ. Bước tiếp theo:

Thực hiện các phương thức được giới thiệu bởi giao diện với docblocks - đặc biệt:

/**
 * [...]
 * @return Order
 */
orderCollection::current()

/**
 * [...]
 * @return integer E.g. database identifier of the order
 */
orderCollection::key()

/**
 * [...]
 * @return Order
 */
orderCollection::offsetGet()

Đừng quên sử dụng loại gợi ý loại cho:

orderCollection::append(Order $order)
orderCollection::offsetSet(Order $order)

Giải pháp này dừng lại giới thiệu rất nhiều:

/** @var $key ... */
/** @var $value ... */

Tất cả các tệp mã của bạn (ví dụ: trong vòng lặp), như Zahymaka đã xác nhận với câu trả lời của cô ấy/anh ấy. Người dùng API của bạn không bị buộc phải giới thiệu DocBlocks đó, phải hoàn thành mã. Để có @return chỉ ở một nơi làm giảm sự dư thừa (@var) càng nhiều càng tốt. Rắc "docblocks với @var" sẽ làm cho mã của bạn dễ đọc nhất.

Finaly bạn đã hoàn thành. Có vẻ khó để đạt được? Có vẻ như lấy một chiếc búa tạ để bẻ khóa một hạt? Không thực sự, vì bạn đã quen thuộc với các giao diện đó và với mã sạch. Hãy nhớ rằng: Mã nguồn của bạn được viết một lần / đọc nhiều.

Nếu mã hoàn thành IDE của bạn không hoạt động với phương pháp này, hãy chuyển sang một phương pháp tốt hơn (ví dụ: Intellij Idea, PhpStorm, NetBeans) hoặc gửi yêu cầu tính năng về trình theo dõi vấn đề của nhà sản xuất IDE của bạn.

Cảm ơn Christian Weiss (từ Đức) vì đã trở thành huấn luyện viên của tôi và đã dạy tôi một thứ tuyệt vời như vậy. Tái bút: Gặp tôi và anh ấy trên Xing.

Trong PHP, loại

class orderCollection implements RecursiveArrayIterator
3 thường được sử dụng để biểu thị ba cấu trúc dữ liệu khác nhau:

List:


$a = [1, 2, 3, 4, 5];

Mảng liên kết:


$a = [0 => 'hello', 5 => 'goodbye'];
$b = ['a' => 'AA', 'b' => 'BB', 'c' => 'CC']

Cấu trúc tạm thời:


$a = ['name' => 'Psalm', 'type' => 'tool'];

PHP xử lý tất cả các mảng này giống nhau, về cơ bản (mặc dù có một số tối ưu hóa dưới mui xe cho trường hợp đầu tiên).

Thi thiên có một vài cách khác nhau để thể hiện các mảng trong hệ thống loại của nó:

Mảng chung

Thi thiên sử dụng cú pháp mượn từ Java cho phép bạn biểu thị các loại của cả khóa và giá trị:

/** @return array */

Bạn cũng có thể chỉ định rằng một mảng không trống với loại đặc biệt

class orderCollection implements RecursiveArrayIterator
4.

Cú pháp PHPDOC

PHPDOC cho phép bạn chỉ định loại giá trị mà một mảng chung giữ với chú thích:

class orderCollection implements ArrayIterator
0

Trong Thi thiên, chú thích này tương đương với

class orderCollection implements RecursiveArrayIterator
5.

Mảng chung bao gồm cả hai mảng và danh sách kết hợp.

Danh sách

(Thi thiên 3.6+)

Thi thiên hỗ trợ một loại

class orderCollection implements RecursiveArrayIterator
6 đại diện cho các mảng liên tục, số nguyên như
class orderCollection implements RecursiveArrayIterator
7.

Một cách thường xuyên để tạo một danh sách là với ký hiệu

class orderCollection implements RecursiveArrayIterator
8.

Các mảng này sẽ trả về đúng với ____ 29 (PHP 8.1+) và đại diện cho một tỷ lệ phần trăm lớn của tất cả việc sử dụng mảng trong các ứng dụng PHP.

Một loại

class orderCollection implements RecursiveArrayIterator
6 có dạng
/**
 * [...]
 * @return Order
 */
orderCollection::current()

/**
 * [...]
 * @return integer E.g. database identifier of the order
 */
orderCollection::key()

/**
 * [...]
 * @return Order
 */
orderCollection::offsetGet()
1, trong đó
/**
 * [...]
 * @return Order
 */
orderCollection::current()

/**
 * [...]
 * @return integer E.g. database identifier of the order
 */
orderCollection::key()

/**
 * [...]
 * @return Order
 */
orderCollection::offsetGet()
2 là bất kỳ loại liên minh được phép nào được Thi thiên.

  • class orderCollection implements RecursiveArrayIterator
    
    6 là một kiểu con của
    /**
     * [...]
     * @return Order
     */
    orderCollection::current()
    
    /**
     * [...]
     * @return integer E.g. database identifier of the order
     */
    orderCollection::key()
    
    /**
     * [...]
     * @return Order
     */
    orderCollection::offsetGet()
    
    4
  • /**
     * [...]
     * @return Order
     */
    orderCollection::current()
    
    /**
     * [...]
     * @return integer E.g. database identifier of the order
     */
    orderCollection::key()
    
    /**
     * [...]
     * @return Order
     */
    orderCollection::offsetGet()
    
    5 là một loại phụ của
    /**
     * [...]
     * @return Order
     */
    orderCollection::current()
    
    /**
     * [...]
     * @return integer E.g. database identifier of the order
     */
    orderCollection::key()
    
    /**
     * [...]
     * @return Order
     */
    orderCollection::offsetGet()
    
    6.

Các loại danh sách hiển thị giá trị của chúng theo một số cách:

class orderCollection implements ArrayIterator
1

Hình dạng mảng

Thi thiên hỗ trợ một định dạng đặc biệt cho các mảng trong đó các độ lệch chính được biết đến: hình dạng mảng, còn được gọi là "mảng giống như đối tượng".

Đưa ra một mảng

class orderCollection implements ArrayIterator
2

Thi thiên sẽ nhập nó trong nội bộ như:

class orderCollection implements ArrayIterator
3

Bạn có thể chỉ định các loại trong định dạng đó, ví dụ:

class orderCollection implements ArrayIterator
4

Các phím tùy chọn có thể được ký hiệu bằng một dấu vết

/**
 * [...]
 * @return Order
 */
orderCollection::current()

/**
 * [...]
 * @return integer E.g. database identifier of the order
 */
orderCollection::key()

/**
 * [...]
 * @return Order
 */
orderCollection::offsetGet()
7, ví dụ:

class orderCollection implements ArrayIterator
5

Mẹo: Nếu bạn thấy mình sao chép cùng một hình dạng mảng phức tạp nhiều lần để tránh các vấn đề

/**
 * [...]
 * @return Order
 */
orderCollection::current()

/**
 * [...]
 * @return integer E.g. database identifier of the order
 */
orderCollection::key()

/**
 * [...]
 * @return Order
 */
orderCollection::offsetGet()
8, thay vào đó hãy thử sử dụng các bí danh loại.

Xác thực hình dạng mảng

Sử dụng Valinor ở chế độ nghiêm ngặt để dễ dàng khẳng định các hình dạng mảng khi chạy bằng cú pháp hình dạng mảng thánh vịnh (thay vì xác nhận thủ công các phím với ISSET):

class orderCollection implements ArrayIterator
6

Valinor cung cấp cả thời gian chạy và các xác nhận thánh vịnh tĩnh với hỗ trợ cú pháp thánh vịnh đầy đủ và nhiều tính năng khác, hãy xem tài liệu Valinor để biết thêm thông tin!

Danh sách hình dạng

Bắt đầu trong Thi thiên 5, Thi -thiên cũng hỗ trợ một định dạng đặc biệt cho các mảng danh sách nơi biết các độ lệch chính.

Đưa ra một mảng danh sách

class orderCollection implements ArrayIterator
7

Thi thiên sẽ nhập nó trong nội bộ như:

class orderCollection implements ArrayIterator
8

Bạn có thể chỉ định các loại trong định dạng đó, ví dụ:

class orderCollection implements ArrayIterator
9

Các phím tùy chọn có thể được ký hiệu bằng một dấu vết

/**
 * [...]
 * @return Order
 */
orderCollection::current()

/**
 * [...]
 * @return integer E.g. database identifier of the order
 */
orderCollection::key()

/**
 * [...]
 * @return Order
 */
orderCollection::offsetGet()
7, ví dụ:

class orderCollection implements RecursiveArrayIterator
0

Mẹo: Nếu bạn thấy mình sao chép cùng một hình dạng mảng phức tạp nhiều lần để tránh các vấn đề

/**
 * [...]
 * @return Order
 */
orderCollection::current()

/**
 * [...]
 * @return integer E.g. database identifier of the order
 */
orderCollection::key()

/**
 * [...]
 * @return Order
 */
orderCollection::offsetGet()
8, thay vào đó hãy thử sử dụng các bí danh loại.

Xác thực hình dạng mảng

Sử dụng Valinor ở chế độ nghiêm ngặt để dễ dàng khẳng định các hình dạng mảng khi chạy bằng cú pháp hình dạng mảng thánh vịnh (thay vì xác nhận thủ công các phím với ISSET):

Valinor cung cấp cả thời gian chạy và các xác nhận thánh vịnh tĩnh với hỗ trợ cú pháp thánh vịnh đầy đủ và nhiều tính năng khác, hãy xem tài liệu Valinor để biết thêm thông tin!

class orderCollection implements RecursiveArrayIterator
1

Danh sách hình dạng

Bắt đầu trong Thi thiên 5, Thi -thiên cũng hỗ trợ một định dạng đặc biệt cho các mảng danh sách nơi biết các độ lệch chính.

class orderCollection implements RecursiveArrayIterator
2

non-empty-array

Đưa ra một mảng danh sách