Cách truyền thống để lấy thư mục chứa tệp hiện tại bằng PHP là sử dụng dirname(__FILE__). Từ PHP5. 3 có một hằng số ma thuật mới__DIR__ tương đương với lệnh gọi hàm này Show
__DIR__ hằng số ma thuậtHằng ma thuật __DIR__ là một "hằng số ma thuật" thay đổi tùy thuộc vào nơi nó được sử dụng. Nó chứa thư mục của tệp mà nó nằm trong. Nếu tệp là một bao gồm, thì đó là thư mục bao gồm tệp nằm trong. Nếu đó là tập lệnh chính thì đó là thư mục chứa tập lệnh __DIR__ có sẵn từ PHP 5. 3 chỉ. Nếu các phiên bản trước, thông báo sẽ được đưa ra nếu nó được sử dụng và giá trị sẽ là __DIR__ chứ không phải thư mục thực tế __DIR__ có thể được sử dụng để lấy thư mục làm việc của mã hiện tại. Nó đã được giới thiệu trong PHP bắt đầu từ phiên bản 5. 3. Nó tương tự như sử dụng dirname(__FILE__). Thông thường, nó được sử dụng để bao gồm các tệp khác có trong một tệp được bao gồm Xem xét cấu trúc thư mục sau - Thư mục có tên "master" có hai tệp có tên 'worker_1' và 'worker_2'. Bản thân thư mục chính là một thư mục con của thư mục dự án chính Thư mục dự án cũng chứa một chỉ mục. tập tin php Xem xét việc có hai tệp trong một thư mục có tên là inc, đây là thư mục con của thư mục dự án của chúng tôi, trong đó chỉ mục. tập tin php nằm - project_directory ├── master │ ├── worker_1.php │ └── worker_2.php └── index.php Nếu chúng ta thực thi mã - include "master/worker_1.php"; từ chỉ mục. php, nó chạy thành công Nhưng để chạy worker_1. php bằng cách bao gồm worker_2. php, một họ hàng bao gồm chỉ mục. php phải được thực hiện, như hình dưới đây - Tôi thường thấy rằng những thứ đơn giản là những thứ bị lãng quên hoặc không biết nhất. Gần đây, tôi đang giúp đồng nghiệp học PHP và tôi thường được hỏi về cách di chuyển lên và xuống các cấp độ thư mục liên quan đến tệp hiện tại Tôi biết hai cách tương đối đơn giản để làm điều này; Chúng tôi cũng sẽ sử dụng 'Hằng số ma thuật' trong bài đăng này, nhưng tôi đã giải thích những điều này một chút ở đây một cách khéo léo Cấp thư mục sử dụng dirname()Nếu bạn đang sử dụng PHP 7. 0 trở lên thì cách tốt nhất để điều hướng từ đường dẫn tệp hoặc thư mục hiện tại của bạn là sử dụng dirname(). Hàm này sẽ trả về thư mục mẹ của bất kỳ đường dẫn nào chúng ta chuyển đến nó. Trong PHP 7 trở lên, chúng tôi có thể chỉ định số lượng cấp độ chúng tôi muốn di chuyển. Để sử dụng điều này, trước tiên chúng tôi chuyển đường dẫn tệp hoặc thư mục dưới dạng một chuỗi, sau đó chỉ định số cấp chúng tôi muốn chuyển lên từ thư mục đó Giả sử rằng tập lệnh của chúng ta đang chạy trong /path/to/file/index. php
Bằng cách sử dụng 'Magic Constant' '__DIR__' và chỉ định cấp độ 2, chúng tôi đang yêu cầu dirname() trả về 2 cấp độ từ cấp độ gốc của '__DIR__'. Trong trường hợp này '__DIR__' là '/path/to/file', nên cao hơn 2 cấp là '/path' Nhớ. dirname() trả về thư mục mẹ, vì vậy sử dụng ‘dirname(__DIR__)’ sẽ trả về thư mục mẹ của ‘__DIR__’ Nếu chúng ta sử dụng '__FILE__' thì hơi khác một chút
Vì '__FILE__' trả về tệp trong chuỗi, nên thư mục mẹ là '/path/to/file'. Bằng cách chỉ định mức 2, giờ đây chúng tôi chuyển sang ‘/path/to’ thay vào đó Các cấp thư mục sử dụng realpath()Nếu bạn đang sử dụng phiên bản PHP cũ hơn thì may mắn thay, chúng ta có thể sử dụng realpath() 'Magic Constant' '__DIR__' đã được thêm vào PHP trong 5. 3, vì vậy đối với người 5. 3 đến 5. 6 chúng ta có thể di chuyển các cấp thư mục như thế này Một lần nữa, giả sử rằng tập lệnh của chúng ta đang chạy trong /path/to/file/index. php
Trong ví dụ này, realpath() giải quyết tham chiếu ‘/. ’ liên quan đến ‘__DIR__’ và đưa chúng tôi lên 1 cấp cao hơn. Nếu chúng ta sử dụng ‘/. /. ’ sau đó chúng tôi sẽ chuyển lên 2 cấp cao hơn, v.v. Nếu chúng ta quay trở lại xa hơn PHP 5. 3 thì chúng ta sẽ phải sử dụng realpath(), dirname() và ‘Magic Constant’ ‘__FILE__’ Về cơ bản, realpath() sẽ không chấp nhận tệp, chỉ chấp nhận đường dẫn. Điều này có nghĩa là chúng ta phải xóa 'chỉ mục. php' từ chuỗi '__FILE__' của chúng tôi. Có một số cách mà chúng ta có thể đạt được điều này, một trong số đó là sử dụng dirname()
Ví dụ này lấy thư mục mẹ của ‘__FILE__’ và sau đó giải quyết ‘/. ’ sử dụng realpath() để di chuyển nó cao hơn 1 cấp Gọi một hằng số phải luôn nhanh hơn gọi hàm, phải không? . Phương pháp kiểm traKhi chạy nhiều thử nghiệm, tôi nhận thấy rằng travis-ci có thể là một trợ thủ đắc lực. Bạn có thể xác định ma trận của các thử nghiệm mà bạn muốn chạy làm ma trận thử nghiệm của mình và sau đó sử dụng kết quả. Vì vậy, tôi thiết lập một repo cho các bài kiểm tra của mình. Repo chứa bốn phần chính
Thử nghiệm của tôi gọi chức năng tôi đang tìm kiếm 100.000 mỗi chức năng. Một lần chạy có tất cả các tệp trong 1 thư mục và lần chạy kia có một tệp trên mỗi thư mục. Tôi muốn loại trừ khả năng một thư mục duy nhất có thể ảnh hưởng đến cuộc gọi này Tôi đã chạy thử nghiệm này trên sáu phiên bản PHP. 5. 6. 40, 7. 0. 33, 7. 1. 27, 7. 2. 15, 7. 3. 9 và 7. 4-dev. Mỗi thử nghiệm thực hiện 650 lần chạy và tôi đã xem xét thời gian của người dùng cho mỗi lần chạy đó. Điều này có nghĩa là tôi đã gọi cho cả
Kết quả kiểm tra __DIR__ so với dirname( __FILE__)hiệu suất 95%kịch bản5. 67. 07. 17. 27. 37. 4dir ( 1 thư mục)1. 42. 762. 082. 512. 271. 3615dir (nhiều thư mục)1. 382. 292. 552. 36152. 651. 57dirname( 1 thư mục)1. 58152. 272. 74153. 242. 411. 5215dirname(nhiều thư mục)1. 682. 292. 08153. 292. 68151. 87Nhìn chung, kết quả cho thấy rằng Vì thế. __dir__ hay dirname(__FILE__)0?Vào cuối ngày, hiệu suất của Nếu bạn có suy nghĩ khác hoặc nghĩ rằng phương pháp thử nghiệm của tôi có thể được cải thiện, vui lòng cho tôi biết trong phần nhận xét bên dưới dirname (__ TRỰC TIẾP __) là gì?Có thể sử dụng __DIR__ để lấy thư mục làm việc của mã hiện tại . Nó đã được giới thiệu trong PHP bắt đầu từ phiên bản 5. 3. Nó tương tự như sử dụng dirname(__FILE__). Thông thường, nó được sử dụng để bao gồm các tệp khác có trong một tệp được bao gồm.
Sự khác biệt giữa __ DIR __ và dirname (__ tệp __) là gì?__DIR__. Thư mục của tập tin. Nếu được sử dụng bên trong tệp bao gồm, thư mục của tệp được bao gồm sẽ được trả về. Điều này tương đương với dirname(__FILE__) . Tên thư mục này không có dấu gạch chéo trừ khi nó là thư mục gốc.
Làm cách nào để lấy thư mục của tệp trong PHP?Kể từ PHP 4. 0. 2, __FILE__ trả về đường dẫn tuyệt đối của tập lệnh đang chạy ngay cả khi đó là tệp bao gồm. Bằng cách gán hằng số __FILE__ cho hàm dirname , bạn sẽ nhận được thư mục của tập lệnh.
Làm cách nào để lấy tên tệp hiện tại trong PHP? |