


Let’s look at an example first:
<?php class A { public $b; public $c; public function A() { //TODO } public function Method() { $this->b=new B(); $this->c=new C(); $this->b->Method(); $this->c->Method(); //TODO } } class B { public function B() { //TODO } public function Method() { //TODO echo 'b'; } } class C { public function C() { //TODO } public function Method() { //TODO echo 'c'; } } $a=new A(); $a->Method(); ?>
The above code, we can easily understand one sentence:
A classDepend on Class B and Class C
In other words, if in the future development process, Class B or Class C needs to be modified, once thefunction is renamed, the function If the number of parameters changes, or even if the entire class structure is adjusted, we must also make corresponding adjustments to Class A. The independence of Class A is lost, which is very inconvenient during the development process, which is what we call "One thing affects the whole body." If the two categories are written by two people separately, conflicts often arise at this time. . .
If we really need to change categories B and C, is there any way to not change the code of category A or to change it as little as possible? Inversion of control is used here.High-level modules should not depend on low-level modules, both should rely on abstractions.Inversion of Control (IOC) is an idea,
Dependency Injection (DI) is a method to implement this idea.
The first method is called: constructor injection (this method is not recommended, but it is better than not using it)class A { public $b; public $c; public function A($b,$c) { $this->b=$b; $this->c=$c; } public function Method() { $this->b->Method(); $this->c->Method(); } }The client class is written like this :
$a=new A(new B(),new C()); $a->Method();The constructor of class A depends on class B and class C. It is passed in through the parameters of the constructor. At least one thing is achieved, which is class BIf One day, we need to expand Class B and make two subclasses of Class B
class B { public function B() { //TODO } public function Method() { //TODO echo 'b'; } } class B1 extends B { public function B1() { //TODO } public function Method() { echo 'b1'; } } class B2 extends B { public function B2() { //TODO } public function Method() { echo 'b2'; } }is also very simple. The client class is written like this:
$a=new A(new B2(),new C()); $a->Method();So class A does not need to care about which subclasses class B has. It only needs to be concerned about in the client class. The second method is called:
Factory modeInjection (recommended)
class Factory { public function Factory() { //TODO } public function create($s) { switch($s) { case 'B': { return new B(); break; } case 'C': { return new C(); break; } default: { return null; break; } } } }Our Class A code is changed to:
class A { public $b; public $c; public function A() { //TODO } public function Method() { $f=new Factory(); $this->b=$f->create('B'); $this->c=$f->create('C'); $this->b->Method(); $this->c->Method(); //TODO } }In fact, a small part has been decoupled. At least if the
constructor of classes B and C changes, such as modifying function parameters, etc., we Just change the Factory class.
Abstraction should not depend on details, details should depend on abstraction.Abstract the methods in classes B and C and make an
interface IMethod { public function Method(); }In this way, A The $b
variables and $c variables in the class are no longer a specific variable, but an abstract class type variable. Until the moment of running, their identity is unknown. How is the Method method implemented?
class B implements IMethod { public function B() { //TODO } public function Method() { //TODO echo 'b'; } } class C implements IMethod { public function C() { //TODO } public function Method() { //TODO echo 'c'; } }To summarize a few points: 1. We move the creation of class B objects and class C objects in class A outside class A2. Originally Class A relied on Class B and Class C, but now A depends on Factory, and Factory depends on B and C.
The above is the detailed content of Detailed explanation of example code of PHP Inversion of Control (IOC) and Dependency Injection (DI). For more information, please follow other related articles on the PHP Chinese website!

PHPsessionstrackuserdataacrossmultiplepagerequestsusingauniqueIDstoredinacookie.Here'showtomanagethemeffectively:1)Startasessionwithsession_start()andstoredatain$_SESSION.2)RegeneratethesessionIDafterloginwithsession_regenerate_id(true)topreventsessi

In PHP, iterating through session data can be achieved through the following steps: 1. Start the session using session_start(). 2. Iterate through foreach loop through all key-value pairs in the $_SESSION array. 3. When processing complex data structures, use is_array() or is_object() functions and use print_r() to output detailed information. 4. When optimizing traversal, paging can be used to avoid processing large amounts of data at one time. This will help you manage and use PHP session data more efficiently in your actual project.

The session realizes user authentication through the server-side state management mechanism. 1) Session creation and generation of unique IDs, 2) IDs are passed through cookies, 3) Server stores and accesses session data through IDs, 4) User authentication and status management are realized, improving application security and user experience.

Tostoreauser'snameinaPHPsession,startthesessionwithsession_start(),thenassignthenameto$_SESSION['username'].1)Usesession_start()toinitializethesession.2)Assigntheuser'snameto$_SESSION['username'].Thisallowsyoutoaccessthenameacrossmultiplepages,enhanc

Reasons for PHPSession failure include configuration errors, cookie issues, and session expiration. 1. Configuration error: Check and set the correct session.save_path. 2.Cookie problem: Make sure the cookie is set correctly. 3.Session expires: Adjust session.gc_maxlifetime value to extend session time.

Methods to debug session problems in PHP include: 1. Check whether the session is started correctly; 2. Verify the delivery of the session ID; 3. Check the storage and reading of session data; 4. Check the server configuration. By outputting session ID and data, viewing session file content, etc., you can effectively diagnose and solve session-related problems.

Multiple calls to session_start() will result in warning messages and possible data overwrites. 1) PHP will issue a warning, prompting that the session has been started. 2) It may cause unexpected overwriting of session data. 3) Use session_status() to check the session status to avoid repeated calls.

Configuring the session lifecycle in PHP can be achieved by setting session.gc_maxlifetime and session.cookie_lifetime. 1) session.gc_maxlifetime controls the survival time of server-side session data, 2) session.cookie_lifetime controls the life cycle of client cookies. When set to 0, the cookie expires when the browser is closed.


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

SublimeText3 English version
Recommended: Win version, supports code prompts!

VSCode Windows 64-bit Download
A free and powerful IDE editor launched by Microsoft

PhpStorm Mac version
The latest (2018.2.1) professional PHP integrated development tool

WebStorm Mac version
Useful JavaScript development tools

Dreamweaver CS6
Visual web development tools
