2011-01-11 41 views
26

Khi tiêu đề cho biết, tôi muốn tạo một thể hiện của một lớp từ bên trong một phương thức tĩnh của cùng một lớp. Tôi đã tìm ra cho đến nay là tôi có thể làm như thế này:Tạo thể hiện lớp từ bên trong phương thức tĩnh

class Foo{ 

public $val; 

public static function bar($val){ 
    $inst = new Foo; 
    $inst->val = $val; 
    return $inst; 
} 

} 

Do đó cho phép tôi làm điều này.

$obj = Foo::bar("some variable"); 

Điều này thật tuyệt.

Vì vậy, bây giờ là câu hỏi. Có cách nào dễ dàng hơn để làm điều này mà tôi không biết, hoặc bất kỳ phím tắt nào để đạt được kết quả tương tự? Có bất kỳ ưu điểm hay nhược điểm nào khi tạo một cá thể trong thời trang này không?

Cảm ơn.

+2

lý do của bạn làm nó theo cách này là gì? Tại sao không sử dụng đồng bằng '$ obj = new Foo (" một số biến ");'? –

+1

Điều đó không có ý nghĩa với tôi để tạo ra thứ gì đó với hàm tạo đã được tạo ra ở một thời điểm nào đó. Ví dụ, trong một dự án hiện tại, tôi sử dụng Profile :: get() để tải trong một hồ sơ có (tại một số điểm) đã được "xây dựng". Có lẽ tôi đang lạm dụng các nhà xây dựng hoặc sử dụng điều này như là một câu trả lời cho quá tải. – daniel

Trả lời

68

Cách bạn đang làm là tốt. Có một số thứ khác có thể làm cho cuộc sống của bạn dễ dàng hơn mà bạn cũng có thể làm.

  1. Không mã hóa tên lớp. Nếu bạn đang sử dụng 5.3+, hãy sử dụng từ khóa static. Bằng cách đó, nếu bạn mở rộng các lớp, các chức năng mới có thể nhanh chóng rằng một cũng như:

    public static function bar($var) { 
        $obj = new static(); 
        $obj->var = $var; 
        return $obj; 
    } 
    

    Sau đó, bạn có thể sử dụng nó trong bất kỳ lớp mở rộng mà không cần phải ghi đè lên bất cứ điều gì.

  2. Tìm hiểu xem $var có nên được chuyển thông qua một hàm tạo thay vì được đặt sau khi xây dựng hay không. Nếu đối tượng phụ thuộc vào nó, bạn nên yêu cầu nó.

    public function __construct($var) { 
        $this->var = $var; 
    } 
    

    Bằng cách đó bạn không thể khởi tạo đối tượng mà không đặt biến.

  3. Thực thi việc khởi tạo lớp thông qua phương pháp tĩnh. Nếu bạn đang làm bất cứ điều gì trong đó mà bạn cần phải làm, sau đó làm cho các nhà xây dựng hoặc bảo vệ hoặc tư nhân. Bằng cách đó, ai đó không thể bỏ qua phương pháp tĩnh.

    protected function __construct() {} 
    private function __construct() {} 
    

Tôi hy vọng rằng sẽ giúp ...

Chỉnh sửa: Dựa trên nhận xét của bạn ở trên, có vẻ như tôi đang cố gắng triển khai Singleton Design Pattern. Có rất nhiều thông tin trên mạng về lý do tại sao nó không phải là một ý tưởng tuyệt vời và những điều xấu nó có thể làm. Nó cũng sử dụng.

Nhưng có một vài mẫu khác có thể được sử dụng cho bạn tùy thuộc vào những gì bạn đang làm chính xác.

  • Bạn có thể sử dụng Factory Method nếu bạn đang cố tạo các đối tượng khác nhau bằng các bước tương tự.
  • Nếu tất cả các đối tượng bắt đầu giống nhau và sau đó được tùy chỉnh, bạn có thể sử dụng Prototype Pattern.
  • Bạn có thể sử dụng Object Pool nếu nó đặc biệt đắt tiền để tạo đối tượng của bạn.

Nhưng có một điều cần xem xét, đó là trong các đối tượng PHP có trọng lượng khá nhẹ. Đừng cố gắng tránh tạo một đối tượng mới chỉ cho phí trên đó. Tránh làm những việc nặng nề như truy vấn cơ sở dữ liệu hoặc truy cập hệ thống tập tin nhiều lần. Nhưng đừng lo lắng về việc gọi new Foo() trừ khi nhà xây dựng của foo đặc biệt nặng ...

0

Nếu bạn chỉ đang tạo một đối tượng, điều này không hữu ích lắm. Bạn chỉ có thể gọi một nhà xây dựng. Nhưng nếu bạn đang làm một cái gì đó phức tạp hơn (như bạn đang bắt đầu với một số loại mẫu đơn nhưng chưa bao gồm tất cả các chi tiết trong ví dụ này), thì:

Điều này nghe có vẻ đúng. Nếu bạn muốn ngăn chặn đối tượng được tạo trong cách mặc định như thế này:

$obj = new Foo("Some Variable"); 

Bạn có thể thêm một constructor tin:

class Foo{ 

public $val; 

private __construct(){} 

public static function bar($val){ 
    $inst = new Foo; 
    $inst->val = $val; 
    return $inst; 
} 
} 

Bây giờ bạn thực thi mọi người sử dụng lớp tĩnh của bạn. Sự cần thiết để thiết lập val trong hàm có thể biến mất, vì vậy bạn thậm chí có thể thêm tham số value vào hàm tạo riêng của bạn nhưng làm những thứ khác (có thể bạn muốn làm, như kiểm tra một số kiểu mẫu đơn) trong chức năng 'bar'

3

Điều này giống như một mẫu phương thức nhà máy đơn giản.

Bạn có một lợi thế tốt đẹp: giả sử rằng trong tương lai bạn muốn bắt đầu sử dụng triển khai khác nhau (nhưng điều đó cũng làm tương tự). Sử dụng một nhà máy, bạn có thể thay đổi tất cả các đối tượng được tạo ra ở nhiều nơi của một hệ thống phức tạp đơn giản bằng cách thay đổi phương thức tạo. Lưu ý rằng điều này sẽ làm việc dễ dàng hơn nếu bạn đã sử dụng một lớp bên ngoài (như trong liên kết đầu tiên bên dưới).

Giữ nguyên như bạn hiện có, bạn cũng có thể phân lớp lớp này và ghi đè phương thức để tạo đối tượng phức tạp hơn. Tôi không nghĩ rằng đây là những gì bạn muốn đạt được ở đây.

Dù sao, điều này là tốt để bật Kiểm tra phát triển theo hướng, trừu tượng và nhiều thứ tốt khác.

liên kết:

  1. Php patterns
  2. Factory method pattern on wikipedia
Các vấn đề liên quan