Hướng dẫn check if class uses trait php - kiểm tra xem lớp có sử dụng php trait không

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

Hướng dẫn check if class uses trait php - kiểm tra xem lớp có sử dụng php trait không

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().

https://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

Hướng dẫn check if class uses trait php - kiểm tra xem lớp có sử dụng php trait không

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

Hướng dẫn check if class uses trait php - kiểm tra xem lớp có sử dụng php trait không

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

Hướng dẫn check if class uses trait php - kiểm tra xem lớp có sử dụng php trait không

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 boolean

Nế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ướng dẫn check if class uses trait php - kiểm tra xem lớp có sử dụng php trait không

Hàm dưới đây là từ http://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

Hướng dẫn check if class uses trait php - kiểm tra xem lớp có sử dụng php trait không

Đâ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

Hướng dẫn check if class uses trait php - kiểm tra xem lớp có sử dụng php trait không

Chúng ta sử dụng các đặc điểm trong PHP ở đâu?

Đặc điểm được sử dụng để khai báo các phương thức có thể được sử dụng trong nhiều lớp. Các đặc điểm có thể có các phương thức và phương thức trừu tượng có thể được sử dụng trong nhiều lớp và các phương thức có thể có bất kỳ công cụ sửa đổi truy cập nào (công khai, riêng tư hoặc được bảo vệ).to declare methods that can be used in multiple classes. Traits can have methods and abstract methods that can be used in multiple classes, and the methods can have any access modifier (public, private, or protected).

Lớp tính trạng trong PHP là gì?

Trong PHP, một đặc điểm là một cách để cho phép các nhà phát triển sử dụng lại các phương pháp của các lớp độc lập tồn tại trong các hệ thống phân cấp kế thừa khác nhau.Nói một cách đơn giản, các đặc điểm cho phép bạn tạo các phương thức mong muốn trong cài đặt lớp, sử dụng từ khóa đặc điểm.Sau đó, bạn có thể kế thừa lớp này thông qua từ khóa sử dụng.a way to enable developers to reuse methods of independent classes that exist in different inheritance hierarchies. Simply put, traits allow you to create desirable methods in a class setting, using the trait keyword. You can then inherit this class through the use keyword.

Một đặc điểm có thể có thuộc tính PHP?

Đặc điểm có thể chứa các phương thức (như Sayhello ()) và các thuộc tính (như $ name).Các đặc điểm cũng hỗ trợ các nhà khai thác khả năng hiển thị (công khai, được bảo vệ và riêng tư), các phương thức và thuộc tính tĩnh, và các toán tử lớp như cha mẹ ::, self :: và $ this.Các lớp PHP có thể sử dụng các đặc điểm và bao gồm mã của các đặc điểm.. Traits also support visibility operators (public, protected and private), static methods and properties, and class operators such as parent::, self:: and $this. PHP classes can use traits and include the traits' code.

Trait có thể thực hiện giao diện PHP không?

Lưu ý rằng PHP không cho phép nhiều kế thừa.Vì vậy, các đặc điểm được sử dụng để thực hiện khoảng cách này bằng cách cho phép chúng tôi sử dụng lại cùng một chức năng trong nhiều lớp.Đặc điểm không thể thực hiện giao diện.Một đặc điểm cho phép cả hai lớp sử dụng nó cho yêu cầu giao diện chung.Traits can not implement interfaces. A trait allow both classes to use it for common interface requirement.