Hướng dẫn phpdoc type hint array keys - phím mảng gợi ý kiểu phpdoc

18

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

Tôi có:

$myarr['DB'] = new DB();
$myarr['config'] = new config();

Tôi có thể thực hiện bằng cách nào đó phpstorm để biết chính xác những gì bên trong khóa Thouse không? Bây giờ tôi chỉ thấy gợi ý cho các biến và thuộc tính lớp, nhưng không phải là các khóa mảng.

Được hỏi ngày 16 tháng 9 năm 2015 lúc 14:31Sep 16, 2015 at 14:31

Hướng dẫn phpdoc type hint array keys - phím mảng gợi ý kiểu phpdoc

1

Câu trả lời muộn, nhưng mọi thứ đã thay đổi.

Theo 2021.2 Changelist bây giờ có thể xác định hình dạng của một mảng đơn giản với một nhận xét dòng:

/**
 * @return array{id: int, name: string, object: \Of\Some\Class}
 */
function getArray(): array {...}

Nếu có các mảng giống như đối tượng trong mã của bạn, giờ đây bạn có thể xác định cấu trúc của chúng với chú thích PHPDOC này: Array {key: type, key: gõ, ...}.

Phpstorm cung cấp hoàn thành mã cho các mảng được chú thích như vậy, giảm thời gian bạn dành cho việc gõ thường xuyên và bảo vệ bạn khỏi những sai lầm.

Hỗ trợ được giới hạn trong các định nghĩa hình dạng mảng một dòng. Đối với các cấu trúc lớn hơn, thường tốt hơn là sử dụng các đối tượng và lớp thực.

Thật không may, tôi chưa tìm thấy cách xác định cấu trúc của mảng đa chiều và thật tuyệt khi chú thích một danh sách các mảng "hình" như vậy ...

Đã trả lời ngày 24 tháng 8 năm 2021 lúc 9:37Aug 24, 2021 at 9:37

SwilkswilkSWilk

3.1317 Huy hiệu vàng29 Huy hiệu bạc51 Huy hiệu Đồng7 gold badges29 silver badges51 bronze badges

Bạn có thể xác định các phím mảng trước, sau đó Phpstorm sẽ đề xuất chúng (Ctrl+Space)

$my = array();
$my['qwe'] = '';
$my['asd'] = '';
$my['zxc'] = '';

$my['']// inside '' will be autosuggest

Bạn cũng có thể sử dụng PHPDOC (CTRL+Q):

/**
 * keys:
 * 
 * some_array   (array)
 * some_bool    (boolean)
 * some_double  (double)
 * some_nice_integer    (integer)
 * 
* @return array */ public function toArray(){ // return some array }

Đã trả lời ngày 1 tháng 10 năm 2016 lúc 14:40Oct 1, 2016 at 14:40

Hướng dẫn phpdoc type hint array keys - phím mảng gợi ý kiểu phpdoc

Đối với một mảng tùy ý, phpstorm không biết các khóa được sử dụng trong bất kỳ mảng nào, và do đó không cung cấp gợi ý ở đó. Thậm chí có thể chứng minh rằng không thể thực hiện một tính năng như vậy một cách đáng tin cậy, vì vậy tôi nghĩ rằng bạn đã hết may mắn ở đây.

Thu thập từ:

Stackoverflow trả lời

Đã trả lời ngày 16 tháng 9 năm 2015 lúc 14:43Sep 16, 2015 at 14:43

Khairul Hồi giáo Hồi giáoKhairul Islam

1.2091 Huy hiệu vàng9 Huy hiệu bạc 20 Huy hiệu đồng1 gold badge9 silver badges20 bronze badges

2

$obj = (object)[]; // Cast empty array to object

add properties:
$obj->x = 'some'
$obj->y = 'hints'

Bây giờ, phpstorm, khi gõ

/**
 * @return array{id: int, name: string, object: \Of\Some\Class}
 */
function getArray(): array {...}
2 ..... gợi ý x và y

Hướng dẫn phpdoc type hint array keys - phím mảng gợi ý kiểu phpdoc

Lỗi

4.4649 Huy hiệu vàng32 Huy hiệu bạc40 Huy hiệu đồng9 gold badges32 silver badges40 bronze badges

Đã trả lời ngày 5 tháng 11 năm 2018 lúc 16:33Nov 5, 2018 at 16:33

1

Hướng dẫn phpdoc type hint array keys - phím mảng gợi ý kiểu phpdoc

Xuất bản lần đầu tiên tại đây: https://suckup.de/2020/02/modern-phpdoc-annotations/

Chúng tôi sẽ bắt đầu rất đơn giản với Phpstorm và PHPDOC mặc định, sau đó chúng tôi sẽ tăng độ phức tạp từng bước cho đến khi chúng tôi tự động hoàn thành các khóa mảng trực tiếp từ cơ sở dữ liệu với hỗ trợ an toàn, bất biến và loại an toàn.

1.0 Phpstorm & Khối phpdoc tự động tạo

Đối với nhận xét tài liệu, phpstorm cung cấp hoàn thành được bật theo mặc định. PhpStorm tạo các cuống của „PhpDoc chặn khi bạn nhập thẻ /** mở và nhấn enter, hoặc nhấn Alt+chèn và chỉ định cấu trúc mã (một lớp, phương thức, một hàm, v.v.) vào tài liệu. Tùy thuộc vào sự lựa chọn của bạn, phpstorm sẽ tạo các thẻ cần thiết hoặc thêm một sơ khai tài liệu trống.Enter, or press Alt+Insert and appoint the code construct (a class, a method, a function, and so on) to document. Depending on your choice, PhpStorm will create the required tags or add an empty documentation stub.“

https://www.jetbrains.com/help/phpstorm/phpdoc-comments.html

Code:

/**
 * @param
 array $row
 *
 * @return array
 */
abstract function formatRow(array $row): array;

1.1 Trả lại $ this | tĩnh | tự

Nó khá khó chịu khi bản thân PHP hiện chỉ có „tự là loại trả lại (https://wiki.php.net/rfc/static_return_type) cho lớp hiện tại. Do „ràng buộc tĩnh trễ, bạn có thể sử dụng„ tĩnh trong mã của mình để chỉ phương thức loại A thực sự được gọi, ngay cả khi phương thức được kế thừa. Nhưng trong PHPDOC, bạn đã có thể sử dụng:

  • @return $ this: Nếu bạn thực sự trả lại $ này (ví dụ: đối với giao diện Fluent)$this: if you really return $this (e.g. for fluent interface)
  • @return static: Tham khảo phương thức loại A thực sự đã được gọistatic: refer to the class a method was actually called on
  • @return tự: Tham khảo phương pháp lớp A đã được viết trongself: refer to the class a method was written in

Code:

/**
 * @return static
 */
abstract function getFoo(): self;
https://blog.jetbrains.com/phpstorm/2019/09/phpstorm-2019-2-2-is-released/
Hướng dẫn phpdoc type hint array keys - phím mảng gợi ý kiểu phpdoc
https://blog.jetbrains.com/phpstorm/2019/09/phpstorm-2019-2-2-is-released/

1.2 Mới (và không phải là mới) Cú pháp mảng

Phpstorm và (Phpstan & Psalm) đang hỗ trợ một số cú pháp mảng mới (và một số không phải mới) cho các loại PHPDOC, nhưng hiện tại PhpStorm sẽ không tự động tạo các loại này.

Examples:

  • int []: Một mảng chỉ có giá trị int - [1, 4, 6, 8, 9, phạm]]: an array with only INT values – [1, 4, 6, 8, 9, …]
  • Mảng: Một mảng chỉ có giá trị INT - [4 => 1, 8 => 4, 12 => 6, trên mạng]: an array with only INT values – [4 => 1, 8 => 4, 12 => 6, …]
  • Chuỗi []: Một mảng chỉ có giá trị chuỗi - [„foo,„ Bar ,,: an array with only STRING values – [„foo“, „bar“, …]
  • Mảng: Một mảng chỉ có giá trị chuỗi - [4 => foo, 8 => „bar,: an array with only STRING values – [4 => „foo“, 8 => „bar“, …]
  • Đặt hàng []: Một mảng chỉ có „đặt hàng giá trị -Object-[đặt hàng, đặt hàng, trên mạng]][]: an array with only „Order“-Object values – [Order, Order, …]
  • Mảng: Một mảng có int hoặc chuỗi là khóa và „đặt hàng giá trị -Object-[4 => Thứ tự,‘ foo ‘=> Order, Muff]Order>: an array with INT or STRING as key and „Order“-Object values – [4 => Order, ‘foo‘ => Order, …]
  • Mảng: Một mảng có int hoặc chuỗi là khóa và trộn như các giá trị - [1 => 1, 4 => foo, 6 => \ stdClass, Muff]: an array with INT or STRING as key and mixed as values – [1 => 1, 4 => „foo“, 6 => \stdClass, …]
  • Mảng: Một mảng có int là khóa và một mảng (có int là phím và chuỗi là giá trị) là giá trị - [1 => [1 => foo,], 4 => [1 => 4],: an array with INT as key and and an array (with INT as key and string as value) as values – [1 => [1 => „foo“], 4 => [1 => 4], …]
  • Mảng: Một mảng có int là phím và một mảng (có int là phím và chuỗi là giá trị) là giá trị - [1 => [„foo,„ lall], 4 => [„Öäü ],…]string[]>: an array with INT as key and and an array (with INT as key and string as value) as values – [1 => [„foo“, „lall“], 4 => [„öäü“, „bar“], …]
  • Mảng {đầu ra: Chuỗi, gỡ lỗi: Chuỗi}: Một mảng có khóa „đầu ra và„ Debug: an array with the key „output“ and „debug“, the values are STRING values – [‚output‘ => ‚foo‘, ‚debug‘ => ‚bar‘]
  • Mảng: Một mảng có khóa đầu ra và „Debug, các giá trị là các giá trị chuỗi - [1 => [‚ đầu ra '=> foo', ‚Debug '=> Bar'], 3 => [ đầu ra '=> foo', ‚Debug '=> Bar'], Mạnh]: an array with the key „output“ and „debug“, the values are STRING values – [1 => [‚output‘ => ‚foo‘, ‚debug‘ => ‚bar‘], 3 => [‚output‘ => ‚foo‘, ‚debug‘ => ‚bar‘], …]

Ví dụ (chỉ @Thi thiên-*): Được hỗ trợ bởi Phpstan & Thi thiên

  • Liệt kê: Một mảng có khóa đầu ra và „Debug, các giá trị là các giá trị chuỗi - [0 => [‚ đầu ra '=> foo', ‚Debug '=> Bar'], 1 => [ đầu ra '=> foo', ‚Debug '=> Bar'], Mạnh]: an array with the key „output“ and „debug“, the values are STRING values – [0 => [‚output‘ => ‚foo‘, ‚debug‘ => ‚bar‘], 1 => [‚output‘ => ‚foo‘, ‚debug‘ => ‚bar‘], …]

Live-Examples:

- Thi thiên: https://psalm.dev/r/922D4BA5B1Psalm: https://psalm.dev/r/922d4ba5b1

-PHPStan: https://phpstan.org/r/ce657ef4-9f18-46a1-b21a-e51e3a0e6d2d

Code:

/**
 * @param
 array $row
 *
 * @return array
 */
abstract function formatRow(array $row): array;

Hỗ trợ PHPSTOR? Ví dụ, Phpstorm sẽ chấp nhận „mảng „@Param đặt hàng [] $ đặt hàng và„@psalm-param mảng $ đặt hàng. Sadly PhpStorm did not have good support for these types, so that you often have to add „@psalm-*“ PHPDoc comments. For example PhpStorm will accept „array“ but PhpStorm will not understand the PHPDoc, so that you need to add e.g. „@param Order[] $order“ and „@psalm-param array $order“.

1.3 tự động hoàn thành động & nbsp; (+ dữ liệu từ cơ sở dữ liệu của bạn) thông qua sự hoàn thành sâu thẳm

Nếu bạn có một phương thức, ví dụ: Formatrow ($ Row) Bạn có thể sử dụng „getFieldArray () [0] (Dữ liệu từ cơ sở dữ liệu - bạn phải kết nối IDE với cơ sở dữ liệu của bạn và các truy vấn của bạn cần phải phân tích bằng PhpStorm (hãy xem ảnh chụp màn hình tiếp theo ) và kết hợp dữ liệu tĩnh từ „getheaderfieldArray (), để bạn có tự động hoàn thành từ các nguồn khác nhau.

Code:

/**
 * @param
 array $row = $this->getFieldArray()[0] + $this->getHeaderFieldArray()
 *
 * @return array
 */
abstract function formatRow(array $row): array;

Thêm thông tin + Ví dụ: https://github.com/klesun/deep-assoc-completion

1.4 Kiểm tra tính bất biến thông qua các phân tích mã tĩnh (thông qua Thi thiên)

Và thậm chí còn có nhiều hơn. :) Bạn có thể thêm chú thích PHPDOC sẽ kiểm tra xem bạn có thực sự sử dụng các lớp bất biến hoặc ít nhất là các phương pháp. Vui lòng đọc thêm tại đây: https://psalm.dev/articles/immutability-and-beyond

Code:

/**
 * @param
 array $row = $this->getFieldArray()[0] + $this->getHeaderFieldArray()
 *
 * @return array
 *
 * @psalm-mutation-free
 */
abstract function formatRow(array $row): array;

Live-Example:

- Thi thiên: https://psalm.dev/r/5bac0a9a07

1.5 Generics trong PHP thông qua các phân tích mã tĩnh

Chúng tôi cũng có thể sử dụng thuốc generic thông qua các chú thích mã. Cả Phpstan & Psalm đều hỗ trợ nó, nhưng hỗ trợ của Thi-thiên có tính năng hoàn chỉnh hơn và cả hai công cụ đều có thể sử dụng „@psalm-Hồi-cú pháp. Đây là một số ví dụ đơn giản.

Array_last: sẽ trả về phần tử mảng cuối cùng từ mảng $ (loại: tlast) hoặc $ fallback (loại: tlastfallback). Chúng tôi nói với chức năng rằng các loại xuất phát từ các tham số đầu vào và đầu vào là một mảng của tlast hoặc tlastfallback từ dự phòng.: Will return the last array element from the $array (type: TLast) or the $fallback (type: TLastFallback). We tell the function that the types comes from the input parameters and that the input is an array of TLast or TLastFallback from the fallback.

/**
 * @return array{id: int, name: string, object: \Of\Some\Class}
 */
function getArray(): array {...}
0

Array_First: sẽ trả về phần tử mảng đầu tiên từ mảng $ (loại: tfirst) hoặc $ fallback (loại: tfirstfallback). Chúng tôi nói với chức năng rằng các loại xuất phát từ các thông số đầu vào và đầu vào là một mảng của tfirst hoặc tfirstfallback từ dự phòng.: Will return the first array element from the $array (type: TFirst) or the $fallback (type: TFirstFallback). We tell the function that the types comes from the input params and that the input is an array of TFirst or TFirstFallback from the fallback.

/**
 * @return array{id: int, name: string, object: \Of\Some\Class}
 */
function getArray(): array {...}
1

Vì vậy, chúng tôi có thể xác định „Mẫu và các đối số đầu vào bản đồ trên các loại đó, điều này còn phức tạp hơn nếu bạn sử dụng nó trong bối cảnh lớp và bạn ánh xạ các mẫu trên các thuộc tính của lớp. Nhưng logic sẽ giống nhau.

Dưới đây là một ví dụ phức tạp hơn: https://github.com/voku/arrayy/blob/master/src/collection/collectioninterface.php

Hỗ trợ phpstorm ?: Noop, thật đáng buồn là chúng ta cần hack cái này qua „phpstorm_meta, vì vậy đây là một ví dụ:: Noop, sadly we need to hack this via „PHPSTORM_META“, so here is an example:

  • Ghi đè (\ mảng_filter (0), loại (0)); // Giả sử loại tham số đầu tiên là myClass [] sau đó trả về loại Array_filter sẽ là MyClass []
  • Ghi đè (\ Array_Reduce (0), ElementType (0)); // Giả sử loại tham số đầu tiên là myClass [] sau đó trả về loại mảng_reduce sẽ là myClass

Đọc thêm tại đây:

  • https://blog.jetbrains.com/phpstorm/2019/02/new-phpstorm-meta-php-features/
  • https://gist.github.com/voku/477e5c22a67c2d37ca42150d94e371ea

2.0 Sơ yếu lý lịch

Nó không hoàn hảo, và kiểm tra loại và tự động hoàn thành chỉ với PHPDOC không thực sự là những gì tôi mong đợi cho năm 2020. Nhưng nó hoạt động và tôi hy vọng PHPSTORM sẽ mang lại nhiều hỗ trợ hơn cho các loại chú thích mới trong tương lai.

Nhiều liên kết khác:

  • https://docs.phpdoc.org/latest/guides/types.html
  • https://scrutinizer-ci.com/docs/tools/php/php-analyzer/guides/annotating_code
  • https://github.com/klesun/deep-assoc-completion/blob/master/docs/deep-keys-overview.md
  • https://github.com/php-fig/fig-standards/blob/master/proposed/phpdoc.md#appendix-a-types
  • https://psalm.dev/docs/annotating_code/supported_annotations/

Làm thế nào để bạn tìm thấy các phím mảng?

Hàm Array_Keys () được sử dụng để lấy tất cả các phím hoặc một tập hợp con của các khóa của một mảng.Lưu ý: Nếu tìm kiếm tùy chọn_key_value được chỉ định, thì chỉ có các khóa cho giá trị đó được trả về.Nếu không, tất cả các phím từ mảng được trả về.array_keys() function is used to get all the keys or a subset of the keys of an array. Note: If the optional search_key_value is specified, then only the keys for that value are returned. Otherwise, all the keys from the array are returned.

Mảng nào đã đặt tên là Keys?

Các mảng liên kết là các mảng sử dụng các khóa có tên mà bạn gán cho chúng. are arrays that use named keys that you assign to them.

Các loại mảng khác nhau có sẵn trong PHP là gì?

Trong PHP, có ba loại mảng: mảng được lập chỉ mục - mảng có chỉ mục số.Mảng liên kết - Mảng với các khóa có tên.Mảng đa chiều - Mảng chứa một hoặc nhiều mảng.Indexed arrays - Arrays with a numeric index. Associative arrays - Arrays with named keys. Multidimensional arrays - Arrays containing one or more arrays.