2012-02-15 18 views
5

Tôi đã tạo một lớp nạp tự động hoạt động như dự định, nhưng tôi đã nhận thấy một hành vi kỳ quặc. Khi tôi lặp lại kết quả của các lớp được tìm thấy được chuyển đến phương thức xử lý hàm spl_autoload_register(). Tôi thấy rằng tôi đã tăng gấp đôi. Giống như nếu kịch bản được gọi là hai lần, và bởi vì nó là một singleton dữ liệu xây dựng 2 mảng trong trường hợp của tôi.php singleton giữ tự gọi hai lần trong một lớp tự động nạp

Tôi đang sử dụng phương pháp này để tạo singleton tôi

public static function init() 
{ 
    if (!isset(self::$instance)) 
     self::$instance = new self(); 

    return self::$instance; 
} 

tôi sau đó có các nhà xây dựng chế độ riêng tư. Tôi đã đi qua từng phương pháp gỡ lỗi cố gắng để xem nơi nó xuất hiện để tạo ra một bản sao của chính nó.

Tôi nghi ngờ rằng các lớp và lớp học của tôi cho vấn đề đó đang được nhân bản ở đâu đó trong hàm spl_autoload_register().

bất kỳ trợ giúp nào sẽ được đánh giá cao.

+0

Bạn đã thiết lập các chức năng __clone cho phù hợp? – busypeoples

+0

Bạn có thể đăng mã lớp hoàn chỉnh không? – busypeoples

+0

okays, posted. Nếu tôi chạy nó như một cá thể không singleton thì nó sẽ không tự nhân bản. – Eli

Trả lời

3

Cho phép trình tạo in ra nội dung nào đó. Chỉ để xem liệu nó có thực sự được gọi nhiều hơn một lần không. Bạn đang sử dụng hai bộ nạp tự động phải không? tôi sẽ thiết lập sp_autoload_register ở phần đầu của ứng dụng (có thể là index.php) và đăng ký tất cả các bộ nạp tự động cần thiết. Nhưng thử nghiệm nếu các contructor đang được gọi là nhiều hơn một lần đầu tiên.

// đầu tiên tôi sẽ thay đổi điều này:

private static $instance = null; 

// hàm init

public static function init() { 
    if (self::$instance === null) { 
    self::$instance = new Autoload(); 
    } 

    return self::$instance; 
} 
+0

Tôi đặt một bộ đếm và nó đã chạy lên mỗi khi lớp được gọi. và chắc chắn tôi nhận được +1. Bạn muốn tôi đặt spl_autoload_register ở đâu? Tôi đang gọi kịch bản này một lần trong index.php của tôi rồi. Tôi đã cập nhật bài đăng của mình bằng mã cập nhật của mình quá – Eli

+0

Tôi không chắc chắn về điều này bên trong phương thức đăng ký: spl_autoload_register (mảng ('Autoloader', 'loadClass')); – busypeoples

+0

hmmm, ban đầu tôi đã đặt nó thành 'spl_auto_register ('self :: autoload()')' trước khi tôi đi tuyến đường đơn. – Eli