Hướng dẫn singleton in php w3schools - singleton trong php w3schools

Xin chào. Tôi đang cố gắng tạo một singleton trên PHP, nhưng nó không hoạt động. Theo như tôi biết, một singleton là một lớp có thể chỉ có một trường hợp. Tôi đang cố gắng gọi lớp từ một tệp khác, nhưng Nó đặt lại tất cả các giá trị của nó. Là nó? Tôi không thể gọi lớp từ một tệp khác? Đây là một ví dụ về ý tôi:

class SingletonClass{	protected static $_instance = null;	protected function __construct()	{	}	static public function getInstance()	{		if ( self::$_instance === null )		{			self::$_instance = new self();			echo "instance";		}		return self::$_instance;	}}

index.php

include( "classes/SingletonClass.php" );$singleton = SingletonClass::getInstance();

anotherFile.php

include( "classes/SingletonClass.php" );$singleton = SingletonClass::getInstance();

Giả sử tôi truy cập index.php và index.php chuyển hướng tôi đến một người khác. Trong cả hai trường hợp, nó lặp lại "ví dụ". Nó nên lặp lại nó chỉ một, phải không? Có ai có thể giúp tôi không? Cảm ơn.

Singleton đảm bảo rằng chỉ có thể có một trường hợp của một lớp và cung cấp một điểm truy cập toàn cầu cho trường hợp đó. Singleton là một băng đảng gồm bốn mô hình sáng tạo.

Mẫu Singleton thường được triển khai trong các lớp cơ sở dữ liệu, bộ ghi nhật ký, bộ điều khiển phía trước hoặc các đối tượng yêu cầu và phản hồi.

Singleton: Vấn đề & Giải pháp

Vấn đề

Dung dịch

  • Bạn muốn một lớp có chính xác một trường hợp
  • Bạn muốn thể hiện có thể truy cập được
  • Bạn không muốn sử dụng các biến toàn cầu
  • Mẫu Singleton đảm bảo một lớp chỉ có một trường hợp và cung cấp một điểm toàn cầu để truy cập nó

Singleton: Cân nhắc

  • Thường được sử dụng cho các đối tượng được chia sẻ như cấu hình, hàng đợi, kết nối cơ sở dữ liệu
  • Bạn không muốn môi trường chịu trách nhiệm khởi tạo lớp học
  • Bạn không muốn môi trường chịu trách nhiệm tránh nhiều trường hợp lớp học
  • Singleton thường là một hành vi hỗn hợp

Singleton: Class As Singleton

  • Bạn có thể khai báo các phương thức là tĩnh và sử dụng lớp làm container cho chức năng singleton
  • Bạn chắc chắn sẽ không có ai tạo các trường hợp bổ sung
  • Bạn có thể tận dụng lợi thế của các mẫu khác, chẳng hạn như khởi tạo lười biếng
  • Bạn không có quyền kiểm soát khởi tạo
  • Bạn không có quyền truy cập vào bối cảnh thể hiện
  • Nó không phải chủ đề an toàn

Singleton: Tại sao không sử dụng các biến toàn cầu?

  • Không có cách nào để kiểm soát giá trị của biến toàn cầu
  • Không ngăn cản ai đó tạo ra nhiều trường hợp
  • Các biến toàn cầu không thể đoán trước được
  • Các biến toàn cầu rất khó để gỡ lỗi và kiểm tra
  • Các biến toàn cầu không được bảo đảm
  • Biến toàn cầu làm cho mã khó đọc

Singleton: Sử dụng và lạm dụng

  • Trước khi áp dụng một singleton tự hỏi: Tôi có thực sự cần một người độc thân không?
  • Nhìn vào mã của bạn, kiểm tra số lượng phiên bản lớp
  • Coi chừng không truyền bá kiến ​​thức singleton trong các lớp học mà bạn không thực sự cần
  • Đối với tất cả các ý định và mục đích, một thể hiện singleton là một thể hiện lớp bình thường, bạn có thể chuyển nó dưới dạng tham số

Ví dụ thực tế

Hãy tưởng tượng một lớp 4 sinh viên. Mỗi học sinh có một trách nhiệm khi lớp bắt đầu - anh ấy/cô ấy phải hét to tên của mình để giáo viên của họ viết ra trong sổ tham dự của mình.

Dưới đây là một số mã mẫu thực hiện nhiệm vụ được mô tả theo cách thông thường. Hai lớp được tuyên bố - giáo viên và học sinh. Lớp giáo viên có một thuộc tính được bảo vệ $ _NAME và hai phương thức công khai - một là hàm tạo và một phương thức còn lại đánh dấu một học sinh như hiện tại. Ngoài ra còn có một thuộc tính khác $ _number_of_instances là tĩnh và nó chỉ vì mục đích theo dõi số lượng trường hợp của lớp được tạo.Teacher and Student. The Teacher class has one protected property $_name and two public methods – one is the constructor and the other one marks a student as present. There is also another property $_number_of_instances which is static and it is just for the sake of keeping track of how many instances of the class are created.

Lớp học sinh có hai thuộc tính - tên của học sinh và giáo viên học sinh. Đương nhiên, nó có một nhà xây dựng công khai và một phương thức công khai hét lên cần nói với giáo viên rằng học sinh có mặt.Student class has two properties – the name of the student and the student’s teacher. Naturally, it has one public constructor and a public method shoutYourName that needs to tell the teacher that the student is present.

Một điều cần chú ý là mỗi khi một đối tượng học sinh được khởi tạo, một đối tượng giáo viên hoàn toàn mới cũng được tạo ra. Nói cách khác, mọi học sinh trong lớp này đều có giáo viên riêng của mình. Đi xa hơn xuống mã mẫu, bốn học sinh được tạo ra và sau đó họ thông báo cho giáo viên của họ về sự hiện diện của họ.

_name =  'James Hetfield';
  self::$_number_of_instances ++;
  echo 'number of  teachers:' . self::$_number_of_instances . '
'; } public function takeAttendance($studentName) { //mark the student as present (insert to database) echo $studentName . 'is present.
'; } } class Student{ private $_name; private $_teacher; //the teacher of the student public function __construct($name) { //create a student $this->_name = $name; $this->_teacher = new Teacher(); } public function shoutYourName(){ $this->_teacher->takeAttendance($this->_name); } } $kirk = new Student('Kirk'); $lars = new Student('Lars'); $robert = new Student('Robert'); $jason = new Student('Jason'); $kirk->shoutYourName(); $lars->shoutYourName(); $robert->shoutYourName(); $jason->shoutYourName(); ?>

Đầu ra: Số lượng giáo viên: 1 Số giáo viên: 2 Số giáo viên: 3 Số giáo viên: 4 Kirk có mặt. Lars có mặt. Robert có mặt. Jason có mặt.
number of teachers:1
number of teachers:2
number of teachers:3
number of teachers:4
Kirk is present.
Lars is present.
Robert is present.
Jason is present.

Hình ảnh dưới đây minh họa kết quả của việc thực hiện thông thường. Nó tạo ra nhiều đối tượng không cần thiết làm điều tương tự về cơ bản (hơn nữa, nó không tạo lại cốt truyện được mô tả của 4 học sinh và chỉ có 1 giáo viên).

Hướng dẫn singleton in php w3schools - singleton trong php w3schools

Đây là nơi mô hình singleton đi vào chơi. Dưới đây bạn có thể thấy một bản viết lại của mã mẫu. Lớp giáo viên đã được sửa đổi để trở thành A, cái được gọi là lớp Singleton. Các sửa đổi như sau:Singleton pattern comes into play. Below you can see a rewrite of the sample code. The Teacher class has been modified to become a, what is called, Singleton class. The modifications are as follows:

  • Một thuộc tính tĩnh khác đã được thêm vào $ _instance sẽ giữ thể hiện tự tạo của lớp.$_instance that will hold the self-created instance of the class.
  • Phương pháp xây dựng đã được thay đổi từ công khai sang riêng tư, hạn chế quyền truy cập của nó từ bên ngoài.public to private, restricting its access from the outside.
  • Một phương thức riêng __clone () đã được khai báo (không làm gì) để ghi đè lên Phương thức ma thuật PHP __clone () để ngăn chặn nhân bản đối tượng__clone() has been declared (doing nothing) to overwrite the PHP magic method __clone() in order to prevent object cloning
  • Một phương thức tĩnh công khai getInstance () đã được tạo ra. Chức năng của nó là kiểm tra xem đã có một thể hiện của lớp, nếu không có nó tạo ra một phiên bản, lưu trữ nó trong biến $ _Instance tĩnh và cuối cùng trả lại cho bất cứ ai yêu cầu.getInstance() has been created. Its function is to check if there is already an instance of the class, if there is not it creates one, stores it in the static $_instance variable and finally returns it to whoever requested it.
  • Đối tượng học sinh có một tham chiếu đến phiên bản giáo viên của giáo viên bằng cách gọi cho giáo viên :: phương thức getInstance.Teacher::getInstance method.
_name = 'James Hetfield';
self::$_number_of_instances ++;
echo 'number of teachers:' . self::$_number_of_instances .'
'; } private function __clone() { //do nothing (this overwrites the special PHP method __clone()) } public static function getInstance() { if(!(self::$_instance instanceof self)) { self::$_instance = new self(); } return self::$_instance; } public function takeAttendance($studentName) { //mark the student as present (insert to database) echo $studentName . ' is present.
'; } } class Student{ private $_name; private $_teacher; //the teacher of the student public function __construct($name) { //create a student $this->_name = $name; $this->_teacher = Teacher::getInstance(); } public function shoutYourName(){ $this->_teacher->takeAttendance($this->_name); } } $kirk = new Student('Kirk'); $lars = new Student('Lars'); $robert = new Student('Robert'); $jason = new Student('Jason'); $kirk->shoutYourName(); $lars->shoutYourName(); $robert->shoutYourName(); $jason->shoutYourName(); ?>

Mã xuất ra như sau:

Số lượng giáo viên: 1 Kirk có mặt. Lars có mặt. Robert có mặt. Jason có mặt.
Kirk is present.
Lars is present.
Robert is present.
Jason is present.

Hình ảnh dưới đây cho thấy kết quả. Như bạn có thể thấy, sử dụng mẫu singleton, lớp giáo viên đã được khởi tạo chỉ một lần và sau đó mỗi đối tượng học sinh nhận được một tham chiếu của trường hợp đó.

Hướng dẫn singleton in php w3schools - singleton trong php w3schools

Lợi ích của mẫu Singleton

Mẫu Singleton ngăn chặn sự trùng lặp bộ nhớ và do đó, tiết kiệm tài nguyên hệ thống. Ngoài ra, sử dụng mẫu Singleton, bạn có thể chắc chắn rằng chỉ có một đường dẫn luồng cho một nhiệm vụ hoặc dữ liệu nhất định. Điều này dẫn đến luồng công việc ứng dụng được kiểm soát và an toàn hơn cũng như gỡ lỗi và bảo trì dễ dàng hơn.

Hướng dẫn singleton in php w3schools - singleton trong php w3schools

Hướng dẫn singleton in php w3schools - singleton trong php w3schools

Xin chào, tôi tên là Masud Alam, thích làm việc với các công nghệ nguồn mở, sống ở Dhaka, Bangladesh. Tôi là một kỹ sư được chứng nhận trên Zend Php 5.3, tôi đã phục vụ mười lăm năm đầu tiên của mình một số vị trí lãnh đạo tại Amarbebsha Ltd với tư cách là CTO, Winux Soft Ltd, SSL Wireless Ltd, Cơ quan Phát triển Quốc tế Canada (CIDA) , Helen Keller, US Aid và Max Group, nơi tôi đã làm việc về phát triển phần mềm và phát triển web của ERP. Khóa học phát triển tại Viện đào tạo W3Programmers - một viện đào tạo hàng đầu trong cả nước.