Hướng dẫn php get all classes in directory - php lấy tất cả các lớp trong thư mục
Cập nhật: Vì câu trả lời này trở nên hơi phổ biến, tôi đã tạo ra một gói Packagist để đơn giản hóa mọi thứ. Về cơ bản, nó chứa những gì tôi đã mô tả ở đây, mà không cần phải tự mình thêm lớp hoặc định cấu hình 8 manually. It may eventually support more than just PSR-4.Gói đó có thể được tìm thấy ở đây: Haydenpierce/Class-Finder.
Xem thêm thông tin trong tệp readme. Tôi không hài lòng với bất kỳ giải pháp nào ở đây nên cuối cùng tôi đã xây dựng lớp học của mình để xử lý việc này. Giải pháp này yêu cầu bạn là:This solution requires that you are:
Tóm lại, lớp này cố gắng tìm ra nơi các lớp thực sự sống trên hệ thống tập tin của bạn dựa trên các không gian tên mà bạn đã xác định trong 9. Chẳng hạn, các lớp được xác định trong không gian tên 0 được tìm thấy trong 1. Điều này có thể được tin cậy vì ánh xạ cấu trúc thư mục thành không gian tên được yêu cầu bởi PSR-4:
Bạn có thể cần phải điều chỉnh 2 để trỏ đến thư mục có chứa 9.
Fabien sa 8.7373 huy hiệu vàng37 Huy hiệu bạc43 Huy hiệu đồng3 gold badges37 silver badges43 bronze badges Đã trả lời ngày 25 tháng 10 năm 2016 lúc 0:41Oct 25, 2016 at 0:41
13 Cách tiếp cận chung sẽ là để có được tất cả các tên lớp đủ điều kiện (lớp có không gian tên đầy đủ) trong dự án của bạn, sau đó lọc theo không gian tên mong muốn. PHP cung cấp một số chức năng gốc để có được các lớp đó (get_declared_classes, v.v.), nhưng họ sẽ không thể tìm thấy các lớp chưa được tải (bao gồm / yêu cầu), do đó nó sẽ không hoạt động như mong đợi với trình tải tự động (như trình soạn thảo cho thí dụ). Đây là một vấn đề lớn vì việc sử dụng các trình tải tự động là rất phổ biến. Vì vậy, phương sách cuối cùng của bạn là tự mình tìm tất cả các tệp PHP và phân tích chúng để trích xuất không gian tên và lớp học của họ:
Nếu bạn theo tiêu chuẩn PSR 0 hoặc PSR 4 (cây thư mục của bạn phản ánh không gian tên của bạn), bạn không phải lọc bất cứ điều gì: Chỉ cần đưa ra đường dẫn tương ứng với không gian tên bạn muốn. Nếu bạn không phải là người hâm mộ sao chép/dán đoạn mã trên, bạn chỉ cần cài đặt thư viện này: https://github.com/gnugat/nomo-paco. Nếu bạn sử dụng PHP> = 5.5, bạn cũng có thể sử dụng thư viện sau: https://github.com/hanneskod/classtools. Đã trả lời ngày 12 tháng 12 năm 2014 lúc 9:30Dec 12, 2014 at 9:30
3 Khá nhiều câu trả lời thú vị ở trên, một số thực sự phức tạp đặc biệt cho nhiệm vụ được đề xuất. Để thêm một hương vị khác vào các khả năng, ở đây là một chức năng không được tối ưu hóa nhanh chóng và dễ dàng để thực hiện những gì bạn yêu cầu bằng cách sử dụng các kỹ thuật cơ bản nhất và các tuyên bố phổ biến mà tôi có thể nghĩ đến:
Sử dụng đơn giản như:
Tôi đã viết chức năng này để cho rằng bạn không thêm "chém kéo dài" ( 4) vào không gian tên, vì vậy bạn sẽ không phải nhân đôi nó để thoát khỏi nó. ;)not adding the last
"trailing slash" ( 4) on the namespace, so you won't have to double it to escape it. ;)Xin lưu ý chức năng này chỉ là một ví dụ và có nhiều lỗ hổng. Dựa trên ví dụ trên, nếu bạn sử dụng ' 5' và ' 6', hàm sẽ trả về tất cả các lớp được tìm thấy trong cả hai không gian tên (hành xử như thể nó là đệ quy). Tuy nhiên, sẽ rất đơn giản để điều chỉnh và mở rộng chức năng này nhiều hơn thế, chủ yếu yêu cầu một vài điều chỉnh trong khối 7.Nó có thể không phải là đỉnh cao của Code-Art-Nouveau, nhưng ít nhất nó thực hiện những gì đã được đề xuất và phải đủ đơn giản để tự giải thích. Tôi hy vọng nó giúp mở đường cho bạn để đạt được những gì bạn đang tìm kiếm. Lưu ý: Php 5, 7 và 8 thân thiện. Đã trả lời ngày 26 tháng 4 năm 2019 lúc 5:15Apr 26, 2019 at 5:15
7 Khá thú vị rằng dường như không có bất kỳ phương pháp phản ánh nào làm điều đó cho bạn. Tuy nhiên, tôi đã đưa ra một lớp học nhỏ có khả năng đọc thông tin không gian tên. Để làm như vậy, bạn phải đi qua máng tất cả các lớp được xác định. Sau đó, chúng tôi lấy không gian tên của lớp đó và lưu trữ nó thành một mảng cùng với chính tên lớp.
Đầu ra sẽ là: 8Tất nhiên mọi thứ bên cạnh lớp không gian tên nếu được lắp ráp nhanh chóng và bẩn. Vì vậy, hãy thoải mái dọn dẹp mớ hỗn độn 9 bằng cách sử dụng tự động tải.Đã trả lời ngày 31 tháng 3 năm 2014 lúc 13:05Mar 31, 2014 at 13:05
THPLTHPLthpl 5.7403 huy hiệu vàng28 Huy hiệu bạc43 Huy hiệu đồng3 gold badges28 silver badges43 bronze badges 1 Tôi nghĩ rằng rất nhiều người có thể có một vấn đề như thế này, vì vậy tôi đã dựa vào các câu trả lời từ @hpierce và @loïc-faugeron để giải quyết vấn đề này. Với lớp được mô tả dưới đây, bạn có thể có tất cả các lớp trong một không gian tên hoặc họ tôn trọng một thuật ngữ nhất định.
Trong trường hợp này, bạn phải sử dụng nhà soạn nhạc để thực hiện tự động tải lớp. Sử dụng lớp học có sẵn trên đó, giải pháp được đơn giản hóa. Đã trả lời ngày 19 tháng 10 năm 2017 lúc 19:22Oct 19, 2017 at 19:22
2 Sử dụng công cụ tìm
cách sử dụng
Đã trả lời ngày 12 tháng 3 năm 2021 lúc 12:08Mar 12, 2021 at 12:08
Tôi sẽ đưa ra một ví dụ thực sự đang được sử dụng trong ứng dụng Laravel 5 của chúng tôi nhưng có thể được sử dụng ở hầu hết mọi nơi. Ví dụ trả về tên lớp với không gian tên có thể dễ dàng lấy ra, nếu không bắt buộc. Truyền thuyết
Mã số
Người Laravel có thể sử dụng 0 trên glob ().Đã trả lời ngày 10 tháng 11 năm 2015 lúc 23:22Nov 10, 2015 at 23:22
Umair Ahmedumair AhmedUmair Ahmed 2.3661 Huy hiệu vàng18 Huy hiệu bạc40 Huy hiệu đồng1 gold badge18 silver badges40 bronze badges Sau khi thử các giải pháp của nhà soạn nhạc ở trên, không hài lòng với thời gian để có được các lớp đệ quy bên trong một không gian tên, tối đa 3 giây nhưng trên một số máy phải mất 6-7 giây không thể chấp nhận được. Dưới đây lớp biểu thị các lớp trong ~ 0,05 trong cấu trúc thư mục độ sâu 3-4 bình thường. 0Usage: 1Result: 2Đã trả lời ngày 11 tháng 7 năm 2019 lúc 18:37Jul 11, 2019 at 18:37
1 Định vị các lớp họcMột lớp có thể được bản địa hóa trong hệ thống tệp bằng tên và không gian tên của nó, giống như trình tải tự động. Trong trường hợp bình thường, không gian tên nên cho đường dẫn tương đối đến các tệp lớp. Các đường dẫn bao gồm là điểm khởi đầu của các đường dẫn tương đối. Hàm 1 Trả về một danh sách bao gồm các đường dẫn trong một chuỗi. Mỗi đường dẫn bao gồm có thể được kiểm tra, cho dù có tồn tại một đường dẫn tương đối phù hợp với không gian tên. Nếu đường dẫn phù hợp được tìm thấy, bạn sẽ biết vị trí của các tệp lớp.Nhận tên lớpNgay khi đã biết vị trí của các tệp lớp, các lớp có thể được trích xuất từ tên tệp, vì tên của tệp lớp phải bao gồm tên lớp theo sau là 2.Mã mẫuDưới đây là mã mẫu để lấy tất cả tên lớp của không gian tên 3 dưới dạng mảng chuỗi: 3Đã trả lời ngày 29 tháng 11 năm 2014 lúc 22:19Nov 29, 2014 at 22:19
HenrikhenrikHenrik 2.6431 Huy hiệu vàng23 Huy hiệu bạc33 Huy hiệu đồng1 gold badge23 silver badges33 bronze badges Lưu ý: Giải pháp này dường như hoạt động trực tiếp với Laravel. Đối với bên ngoài Laravel, bạn có thể cần sao chép và sửa đổi lớp ComposerClassMap từ nguồn đã cho. Tôi đã không thử.: This solution seems to work with Laravel directly. For outside Laravel, you might need to copy and modify the ComposerClassMap class from the given source. I didn't try. Nếu bạn đã sử dụng trình soạn thảo để tự động tải tự động tuân thủ PSR-4, bạn có thể sử dụng phương thức này để có tất cả các lớp được tự động tải và lọc chúng (đó là ví dụ từ hệ thống mô-đun của tôi, được sao chép và dán trực tiếp từ đó): 4Nguồn của lớp 4: https://github.com/facade/ign/blob/master/src/support/composerclassmap.php
Đã trả lời ngày 25 tháng 11 năm 2019 lúc 13:47Nov 25, 2019 at 13:47
Taha Paksutaha PaksuTaha Paksu 15.1k1 Huy hiệu vàng47 Huy hiệu bạc76 Huy hiệu đồng1 gold badge47 silver badges76 bronze badges 2 5, 6 và 7 có thể được sử dụng để truy xuất tất cả các tên lớp
Racil Hilan 24.1K12 Huy hiệu vàng48 Huy hiệu bạc52 Huy hiệu đồng12 gold badges48 silver badges52 bronze badges Đã trả lời ngày 31 tháng 3 năm 2014 lúc 12:38Mar 31, 2014 at 12:38
Bạn có thể sử dụng 8 nhưng với một chút công việc. 5Vì vậy, trước tiên bạn nhận được tất cả các lớp được khai báo và sau đó kiểm tra xem chúng bắt đầu bằng không gian tên của bạn. Lưu ý: Bạn sẽ nhận được mảng trong đó các phím không bắt đầu với 0. Để đạt được điều này, bạn có thể thử: 9.
Đã trả lời ngày 9 tháng 10 năm 2017 lúc 13:07Oct 9, 2017 at 13:07
FreelightmanfreelightmanFreeLightman 2.1341 Huy hiệu vàng23 Huy hiệu bạc40 Huy hiệu đồng1 gold badge23 silver badges40 bronze badges 1 Cách dễ nhất là sử dụng chức năng AutoLoader 0 của riêng bạn và bên trong nó lưu tên các lớp được tải. Điều đó có phù hợp với bạn không?Nếu không, tôi nghĩ rằng bạn sẽ phải đối phó với một số phương pháp phản ánh. Đã trả lời ngày 31 tháng 3 năm 2014 lúc 12:34Mar 31, 2014 at 12:34
UrizielurizielUriziel 1791 Huy hiệu bạc10 Huy hiệu đồng1 silver badge10 bronze badges 1 Tôi chỉ làm một cái gì đó tương tự, điều này tương đối đơn giản nhưng có thể được xây dựng. 6Đã trả lời ngày 24 tháng 4 năm 2019 lúc 18:25Apr 24, 2019 at 18:25
Mattmattmatt Phù hiệu đồng 6277 bronze badges
Đối với Symfony, bạn có thể sử dụng thành phần Finder: http://symfony.com/doc/current/components/finder.html 7Đã trả lời ngày 15 tháng 12 năm 2017 lúc 12:57Dec 15, 2017 at 12:57
|