2011-08-19 32 views
5

Hãy nói rằng tôi đã có các lớp sau:Làm việc với các lớp trong PHP

class Test 
{ 
    function __construct() 
    { 
     // initialize some variable 

     $this->run(); 
    } 

    function run() 
    { 
     // do some stuff 

     $this->handle(); 
    } 

    function handle() 
    { 
    } 
} 

Thông thường tôi sẽ tạo ra một thể hiện như:

$test = new Test(); 

Tuy nhiên tôi không thực sự cần các $test bất cứ nơi nào kể từ các hàm trong lớp làm tất cả công việc một lần và sau đó tôi sẽ không cần thể hiện của lớp nữa.

Tôi nên làm gì trong tình huống này hay nên tôi chỉ làm: $test = new Test();

Tôi hy vọng nó có ý nghĩa gì tôi đang cố gắng để nói nếu không xin vui lòng cho tôi biết.

Trả lời

10

Họ có lẽ nên được chức năng tĩnh, nếu họ không yêu cầu một thể hiện được thuyết minh:

class Test 
{ 
    private static $var1; 
    private static $var2; 

    // Constructor is not used to call `run()`, 
    // though you may need it for other purposes if this class 
    // has non-static methods and properties. 

    // If all properties are used and discarded, they can be 
    // created with an init() function 
    private static function init() { 
     self::$var1 = 'val1'; 
     self::$var2 = 'val2'; 
    } 

    // And destroyed with a destroy() function 


    // Make sure run() is a public method 
    public static function run() 
    { 
     // Initialize 
     self::init(); 

     // access properties 
     echo self::$var1; 

     // handle() is called statically 
     self::handle(); 

     // If all done, eliminate the variables 
     self::$var1 = NULL; 
     self::$var2 = NULL; 
    } 

    // handle() may be a private method. 
    private static function handle() 
    { 
    } 
} 

// called without a constructor: 
Test::run(); 
+0

Tôi cũng nghĩ vậy. Tuy nhiên, nơi/làm thế nào tôi nên initilize biến mà bây giờ diễn ra trong constructor. (PS các biến sẽ được truy cập bởi các hàm khác trong lớp) – PeeHaa

+1

@PeeHaa xem phần bổ sung ở trên. Các thuộc tính tĩnh được khởi tạo trong phương thức 'init()' và được đặt thành NULL sau khi gọi 'handle()'. Cũng có thể xóa chúng bên trong 'handle()' –

+0

tuyệt vời! cảm ơn. Tại sao bạn loại bỏ các biến sau khi kết thúc? – PeeHaa

3

Nếu bạn không cần đến nó, chỉ cần làm:

new Test(); 
1

Bạn chỉ có thể gọi nó như thế này (new Test()).functionHere(). Thay thế, bạn chỉ có thể thực hiện chức năng tĩnh và thực hiện Test::functionHere()

+0

'(new Test()). FunctionHere()' chưa từng thấy kiểu này trước đây. Nó được gọi là gì để tôi có thể tra cứu nó trong tài liệu. – PeeHaa

+0

Tôi không biết nếu nó có một tên chính thức nhưng về cơ bản bạn đang tạo ra các đối tượng mà không tham chiếu nó. Khi 'new Test()' trả về một đối tượng Test mới, nó đã sẵn sàng để sử dụng. Vì vậy, bằng cách gói nó trong '()' bạn có thể imidatly sử dụng các phương pháp của đối tượng – secretformula

1

Không có yêu cầu nào trong số đó là bắt buộc. Ngay cả khi bạn giữ biến $ test không thay đổi bất cứ thứ gì vì nó sẽ không chiếm 0,001% bộ nhớ RAM. Chỉ cần tiếp tục dòng chảy của chương trình. Câu trả lời hay nhất ở trên là bắt đầu lớp mà không lưu một cá thể trong một biến. Đặt cược ngay cả khi bạn làm điều đó sẽ không thay đổi bất cứ điều gì. Nếu tôi là bạn, tôi sẽ rời khỏi biến đó, bởi vì sau này tôi nếu tôi thêm một hàm khác cần phải được gọi thủ công, đó sẽ là cách dễ nhất để gọi nó.

+0

/@ Itehnological một cái gì đó damn bạn tên là quá dài: Nó không thực sự hiệu suất/RAM tôi lo lắng về. Chỉ muốn biết những gì sẽ là thực hành tốt nhất trong trường hợp này. Cảm ơn bạn đã trả lời yor mặc dù :) – PeeHaa

1

Gán một giá trị không phải là cần thiết, nó sẽ làm việc như

new Test; 

Alternativly, bạn có thể viết lớp học của bạn ở định dạng tĩnh:

class Test 
{ 
    public static function run() 
    { 
    // do some stuff 
    self::handle(); 
    } 

    public static function handle() 
    { 
    } 
} 

Và gọi lớp học của bạn như:

Test::run(); 
Các vấn đề liên quan