2010-03-10 44 views
30

Theo tiêu đề, có PHP tương đương với __name__ == "__main__" không?PHP tương đương với Python __name__ == "__main__"?

Có điều gì đó có thể hoạt động đối với cả hai tập lệnh được thực thi thông qua dòng lệnh và thông qua yêu cầu web hoặc chức năng tùy chỉnh có cần thiết không?

Đối với những người không quen thuộc với Python, __name__ == "__main__" cho phép bạn xác định tệp mô-đun và cũng có một số thứ cho phép bạn chạy nó nếu đó là điểm vào. Cấu trúc tương đương trong PHP sẽ giống như thế này:

// SomeClass.php 
<?php 
class SomeClass 
{ 
    function doStuff() { 
     echo "wahey!\n"; 
    } 
} 

// python, I know. 
if (__name__ == "__main__") { 
    $sc = new SomeClass; 
    $sc->doStuff(); 
} 
?> 

// OtherClass.php 
<?php 
require_once("SomeClass.php"); 
class OtherClass 
{ 
    public $yep; 
} 
?> 

// command line: 
php SomeClass.php  // outputs "wahey!" 
php OtherClass.php // outputs nothing 

Note: Câu trả lời zerkms' là tốt nhất, nhưng không phải là hoàn toàn đúng - nó nên đọc:

if (!debug_backtrace()) { 
    // do useful stuff 
} 

Đây là nhanh hơn đáng kể so với số đếm (debug_backtrace()), bản thân nó nhanh hơn gấp đôi so với giải pháp của tôi liên quan đến realpath().

+0

câu trả lời và số đếm của tôi (debug_backtrace()) là gì? – zerkms

Trả lời

28
if (!count(debug_backtrace())) 
{ 
    // some usefull stuff 
} 
+0

php_sapi_name() chỉ cho tôi biết mã nào đang được thực thi, có thể cung cấp một phần nhỏ của câu đố nhưng không giải quyết được vấn đề. Tôi đã thêm một số thông tin thêm vào câu hỏi để giải thích những gì tôi đang nhận được. – Shabbyrobe

+0

... hoặc debug_backtrace() ;-) xem nhận xét cho câu hỏi – zerkms

+0

Ahh, cuối cùng, tôi hiểu. debug_backtrace() hoạt động và nhanh hơn hàng nghìn lần so với đường dẫn thực. Cập nhật câu trả lời của bạn để xóa tham chiếu đến php_sapi_name() và cập nhật ví dụ của bạn để đọc nếu (! Debug_backtrace()) {/ * làm công cụ * /} (hoặc tốt hơn) để tôi có thể chấp nhận. – Shabbyrobe

0

Có thể bạn muốn một trong các "Magic Constants". Tùy thuộc vào những gì bạn đang cố gắng làm, __FILE__, __FUNCTION__ hoặc __CLASS__ có thể cung cấp cho bạn thông tin mà bạn đang theo dõi.

Họ là khá tự giải thích:

  • __FILE__ cung cấp cho bạn tên tập tin hiện
  • __FUNCTION__ cung cấp cho bạn tên của hàm hiện
  • __CLASS__ cung cấp cho bạn tên của lớp hiện hành.

Kiểm tra the manual để biết thêm chi tiết

+0

Có lẽ, nhưng làm thế nào để tôi đi về việc đạt được những gì tôi yêu cầu với những người? – Shabbyrobe

+0

Có vẻ như bạn đã tìm ra câu trả lời của riêng mình :) –

+5

Tôi nghĩ rằng '(realpath ($ argv [0]) == __FILE __)' có thể làm điều đó. – Darien

4
if ($argv && $argv[0] && realpath($argv[0]) === __FILE__) { 
    // ... 
} 

công trình như một say mê.

khi bạn chạy php trong dòng lệnh, tên của tệp php sẽ chuyển đến chương trình dưới dạng tệp $argv[0]__FILE__ phép thuật có nghĩa là biến hiện tại. Vì vậy, chúng tôi kiểm tra các chương trình đang chạy là tập tin hiện hành hợp lý bằng Python __name__ == "__main__".

+0

Vui lòng chỉnh sửa bài đăng của bạn và giải thích lý do tại sao nó hoạt động. –

Các vấn đề liên quan