42
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.
Lưu ý rằng một đặc điểm có thể sử dụng các đặc điểm khác, vì vậy lớp có thể không sử dụng đặc điểm đó trực tiếp. Và cả lớp có thể được kế thừa từ một lớp cha mẹ là người sử dụng đặc điểm.
Đây có phải là một câu hỏi có thể được giải quyết trong một số dòng hoặc tôi sẽ phải thực hiện một số vòng lặp?
Hỏi ngày 14 tháng 9 năm 2017 lúc 11:33Sep 14, 2017 at 11:33
2
Nếu bất cứ ai có vấn đề này trong khi sử dụng khung Laravel, thì có chức năng trợ giúp gọi là class_uses_recursive().
//laravel.com/docs/8.x/helpers#method-class-uses-recursive
Vì vậy, bạn có thể làm một cái gì đó như thế này:
in_array(SomeTrait::class, class_uses_recursive(SomeClass::class))Đã trả lời ngày 15 tháng 9 năm 2020 lúc 12:51Sep 15, 2020 at 12:51
KenkenKen
2.5393 Huy hiệu vàng23 Huy hiệu bạc24 Huy hiệu đồng3 gold badges23 silver badges24 bronze badges
Hàm class_uses () sẽ trả về một mảng chứa tên của tất cả các đặc điểm được sử dụng bởi lớp đó và sẽ hoạt động bằng cách chuyển nó một tên lớp hoặc một thể hiện .... tuy nhiên, bạn cần phải "tái sử dụng" thông qua cây kế thừa để sử dụng tất cả các đặc điểm, và thông qua từng đặc điểm
CHỈNH SỬA
Lưu ý rằng stealz at op dot pl đã cung cấp một chức năng ví dụ cho thấy cách thực hiện đệ quy này trong phần bình luận của trang tài liệu PHP được liên kết
Đã trả lời ngày 14 tháng 9 năm 2017 lúc 11:34Sep 14, 2017 at 11:34
Mark Bakermark BakerMark Baker
207K31 Huy hiệu vàng339 Huy hiệu bạc380 Huy hiệu Đồng31 gold badges339 silver badges380 bronze badges
0
Kiểm tra đặc điểm của bạn trong danh sách đặc điểm:
$usingTrait = in_array( MyTrait::class, array_keys((new \ReflectionClass(MyClass::class))->getTraits()) );Điều này trả về đúng hoặc sai nếu MyClass sử dụng $usingTrait = in_array( MyTrait::class, array_keys((new \ReflectionClass(MyClass::class))->getTraits()) ); 0
Cave Johnson
6.2505 Huy hiệu vàng37 Huy hiệu bạc53 Huy hiệu Đồng5 gold badges37 silver badges53 bronze badges
Đã trả lời ngày 26 tháng 9 năm 2018 lúc 19:05Sep 26, 2018 at 19:05
Davi Menezesdavi MenezesDavi Menezes
4671 Huy hiệu vàng5 Huy hiệu bạc10 Huy hiệu đồng1 gold badge5 silver badges10 bronze badges
2
Một cách khác để tiếp cận điều này là sử dụng các giao diện xác định những gì được mong đợi trong các đặc điểm của bạn. Sau đó, bạn đang sử dụng "InstanceOf SomeInterface" thay vì thực hiện phản xạ hoặc gõ vịt.
Đã trả lời ngày 20 tháng 2 năm 2019 lúc 15:42Feb 20, 2019 at 15:42
Nếu bạn muốn kiểm tra lớp, bạn chỉ có thể sử dụng $usingTrait = in_array( MyTrait::class, array_keys((new \ReflectionClass(MyClass::class))->getTraits()) ); 1, nó sẽ trả lại một mảng gồm tất cả các đặc điểm được sử dụng bởi lớp
in_array(SoftDeletes::class, class_uses(Model::class), true) //return booleanNếu bạn muốn kiểm tra xem lớp hoặc cha mẹ của nó sử dụng đặc điểm $usingTrait = in_array( MyTrait::class, array_keys((new \ReflectionClass(MyClass::class))->getTraits()) ); 2
in_array(SoftDeletes::class, class_uses_recursive(Model::class), true) //return booleanĐã trả lời ngày 6 tháng 2 năm 2021 lúc 1:26Feb 6, 2021 at 1:26
Hàm dưới đây là từ //php.net/manual/en/function.lass-uses.php, bình luận của ULF. Hoạt động hoàn hảo.
function class_uses_deep($class, $autoload = true) { $traits = []; // Get traits of all parent classes do { $traits = array_merge(class_uses($class, $autoload), $traits); } while ($class = get_parent_class($class)); // Get traits of all parent traits $traitsToSearch = $traits; while (!empty($traitsToSearch)) { $newTraits = class_uses(array_pop($traitsToSearch), $autoload); $traits = array_merge($newTraits, $traits); $traitsToSearch = array_merge($newTraits, $traitsToSearch); }; foreach ($traits as $trait => $same) { $traits = array_merge(class_uses($trait, $autoload), $traits); } return array_unique($traits); }Đã trả lời ngày 14 tháng 9 năm 2017 lúc 11:51Sep 14, 2017 at 11:51
BijidangobijidangobijiDango
1.2353 huy hiệu vàng14 Huy hiệu bạc27 Huy hiệu đồng3 gold badges14 silver badges27 bronze badges
Thông thường, kiểm tra xem phần API bạn có ý định sử dụng có tồn tại không phải là một sự thay thế đủ tốt. $usingTrait = in_array(
MyTrait::class,
array_keys((new \ReflectionClass(MyClass::class))->getTraits())
);
3
$usingTrait = in_array(
MyTrait::class,
array_keys((new \ReflectionClass(MyClass::class))->getTraits())
);
3
Ngoài ra, như @meatpopsicle đề cập, các đặc điểm thường được sử dụng kết hợp với các giao diện (đánh dấu).
Đã trả lời ngày 29 tháng 4 năm 2019 lúc 0:30Apr 29, 2019 at 0:30
Đây là những gì tôi có trong lớp công cụ của mình
static function isTrait( $object, $traitName, $autoloader = true ) { $ret = class_uses( $object, $autoloader ) ; if( is_array( $ret ) ) { $ret = array_search( $traitName, $ret ) !== false ; } return $ret ; }Đã trả lời ngày 7 tháng 1 năm 2020 lúc 18:38Jan 7, 2020 at 18:38
DbagsdbagdBags
4174 Huy hiệu bạc4 Huy hiệu đồng4 silver badges4 bronze badges
1
Tôi đã có một số vấn đề với chủ đề này và tôi đã viết một giải pháp mà tôi muốn chia sẻ với mọi người. Bằng cách sử dụng $usingTrait = in_array( MyTrait::class, array_keys((new \ReflectionClass(MyClass::class))->getTraits()) ); 4, bạn có thể sử dụng phương thức thể hiện $usingTrait = in_array( MyTrait::class, array_keys((new \ReflectionClass(MyClass::class))->getTraits()) ); 5. Vấn đề là nó sẽ chỉ trả về một loạt các đặc điểm cho $usingTrait = in_array( MyTrait::class, array_keys((new \ReflectionClass(MyClass::class))->getTraits()) ); 6, và không phải là những đặc điểm di truyền từ các đặc điểm hoặc từ lớp mở rộng.
Đây là giải pháp:
/** @return ReflectionClass[] */ function get_reflection_class_traits( ReflectionClass $reflection, array $traits = [] ): array { if ( $reflection->getParentClass() ) { $traits = get_reflection_class_traits( $reflection->getParentClass(), $traits ); } if ( ! empty( $reflection->getTraits() ) ) { foreach ( $reflection->getTraits() as $trait_key => $trait ) { $traits[$trait_key] = $trait; $traits = get_reflection_class_traits( $trait, $traits ); } } return $traits; } // string|object $objectOrClass Either a string containing the name of the class to reflect, or an object. $objectOrClass = //... $reflection = new ReflectionClass( $objectOrClass ); $all_traits = $this->get_reflection_class_traits( reflection );Đã trả lời ngày 16 tháng 1 lúc 2:30Jan 16 at 2:30