Bird
Raised Fist0
PHPprogramming~10 mins

Dependency injection concept in PHP - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Dependency injection concept
Create Dependency Object
↓
Inject Dependency into Class
↓
Class Uses Dependency
↓
Perform Action with Dependency
↓
Output Result
This flow shows how a dependency object is created, injected into a class, and then used by that class to perform an action.
Execution Sample
PHP
<?php
class Logger {
  public function log($msg) { echo "Log: $msg\n"; }
}

class User {
  private $logger;
  public function __construct(Logger $logger) { $this->logger = $logger; }
  public function create() { $this->logger->log('User created'); }
}

$logger = new Logger();
$user = new User($logger);
$user->create();
?>
This PHP code creates a Logger object, injects it into a User class, and calls a method that uses the Logger to output a message.
Execution Table
StepActionEvaluationResult
1Create Logger object$logger = new Logger()Logger instance created
2Create User object with Logger$user = new User($logger)User instance created with Logger injected
3Call create() on User$user->create()Calls Logger->log('User created')
4Logger logs messageLogger->log('User created')Outputs: Log: User created
5End of scriptNo more codeScript ends
💡 Script ends after User->create() outputs the log message
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3Final
$loggernullLogger instanceLogger instanceLogger instanceLogger instance
$usernullnullUser instance with LoggerUser instance with LoggerUser instance with Logger
Key Moments - 2 Insights
Why do we pass the Logger object into the User constructor instead of creating it inside User?
Passing Logger into User allows us to control which Logger User uses and makes User easier to test and reuse. See execution_table step 2 where User is created with Logger injected.
What happens if we don't inject Logger and User tries to create it internally?
User would be tightly linked to Logger, making it hard to change Logger behavior or test User independently. Dependency injection avoids this by injecting Logger from outside.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the state of $user after step 2?
ANull
BUser instance with Logger injected
CLogger instance
DUser instance without Logger
💡 Hint
Check the 'Result' column in step 2 of the execution_table
At which step does the Logger output the message 'Log: User created'?
AStep 3
BStep 2
CStep 4
DStep 1
💡 Hint
Look at the 'Action' and 'Result' columns in step 4 of the execution_table
If we did not inject Logger into User, which problem would most likely occur?
AUser would be tightly coupled to Logger, reducing flexibility
BLogger would not be created
CUser cannot log messages
DLogger would log twice
💡 Hint
Refer to key_moments about why injection is important
Concept Snapshot
Dependency Injection in PHP:
- Create dependency object (e.g., Logger)
- Pass it into class constructor (e.g., User)
- Class uses injected dependency
- Enables loose coupling and easier testing
- Avoids creating dependencies inside classes
Full Transcript
Dependency injection means giving a class the objects it needs from outside instead of making them inside. In PHP, we create a Logger object first, then pass it to the User class constructor. User stores this Logger and uses it to log messages. This way, User does not create Logger itself, making the code more flexible and easier to test. The execution steps show creating Logger, injecting it into User, calling User's create method, which uses Logger to output a message, and then ending the script.

Practice

(1/5)
1. What is the main idea behind dependency injection in PHP?
easy
A. Providing a class with its required objects from outside instead of creating them inside.
B. Writing all code inside one big class for simplicity.
C. Using global variables to share data between classes.
D. Making classes depend on static methods only.

Solution

  1. Step 1: Understand dependency injection meaning

    Dependency injection means giving a class the objects it needs from outside, not creating them inside the class.
  2. Step 2: Compare options with this meaning

    Only Providing a class with its required objects from outside instead of creating them inside. describes this idea correctly. Others describe bad or unrelated practices.
  3. Final Answer:

    Providing a class with its required objects from outside instead of creating them inside. -> Option A
  4. Quick Check:

    Dependency injection = Provide dependencies from outside [OK]
Hint: Dependency injection means passing needed parts from outside [OK]
Common Mistakes:
  • Thinking dependency injection means using global variables
  • Confusing dependency injection with static methods
  • Believing all code should be inside one class
2. Which of the following is the correct syntax to inject a dependency via constructor in PHP?
easy
A. public function __construct(Database $db) { $this->db == $db; }
B. public function __construct() { $this->db = new Database(); }
C. public function __construct(Database $db) { $this->db = $db; }
D. public function __construct(Database $db) { $db = $this->db; }

Solution

  1. Step 1: Identify correct constructor injection syntax

    Constructor injection requires passing the dependency as a parameter and assigning it to a class property.
  2. Step 2: Check each option

    public function __construct(Database $db) { $this->db = $db; } correctly assigns the passed $db to $this->db. public function __construct() { $this->db = new Database(); } creates the dependency inside, not injection. public function __construct(Database $db) { $db = $this->db; } assigns backwards. public function __construct(Database $db) { $this->db == $db; } uses wrong operator '=='.
  3. Final Answer:

    public function __construct(Database $db) { $this->db = $db; } -> Option C
  4. Quick Check:

    Constructor injection = assign parameter to property [OK]
Hint: Assign constructor parameter to property with =, not == [OK]
Common Mistakes:
  • Creating dependency inside constructor instead of injecting
  • Using == instead of = for assignment
  • Assigning property to parameter instead of reverse
3. Given the code below, what will be the output?
class Logger {
  public function log($msg) { echo "Log: $msg"; }
}

class User {
  private $logger;
  public function __construct(Logger $logger) {
    $this->logger = $logger;
  }
  public function create() {
    $this->logger->log('User created');
  }
}

$logger = new Logger();
$user = new User($logger);
$user->create();
medium
A. User created
B. Log: User created
C. Error: Logger not found
D. No output

Solution

  1. Step 1: Understand dependency injection in code

    The User class receives a Logger object via constructor and stores it in $this->logger.
  2. Step 2: Trace method calls

    Calling $user->create() calls $this->logger->log('User created'), which echoes "Log: User created".
  3. Final Answer:

    Log: User created -> Option B
  4. Quick Check:

    Injected Logger logs message correctly [OK]
Hint: Injected objects run their methods as expected [OK]
Common Mistakes:
  • Expecting just 'User created' without 'Log:' prefix
  • Thinking code throws error due to missing Logger
  • Assuming no output without echo
4. Identify the error in this dependency injection example:
class Mailer {
  public function send($msg) { echo "Sending: $msg"; }
}

class Notification {
  private $mailer;
  public function __construct() {
    $this->mailer = $mailer;
  }
  public function notify() {
    $this->mailer->send('Hello');
  }
}

$notification = new Notification();
$notification->notify();
medium
A. The notify method should be static.
B. The send method is missing a return statement.
C. The Mailer class is not instantiated anywhere.
D. The constructor does not accept Mailer as a parameter to inject.

Solution

  1. Step 1: Check constructor parameters

    The constructor has no parameters but tries to assign $mailer which is undefined inside it.
  2. Step 2: Identify missing injection

    Mailer object should be passed as a parameter to constructor and assigned to $this->mailer.
  3. Final Answer:

    The constructor does not accept Mailer as a parameter to inject. -> Option D
  4. Quick Check:

    Constructor missing dependency parameter [OK]
Hint: Constructor must accept dependency parameter to inject it [OK]
Common Mistakes:
  • Forgetting to pass dependency to constructor
  • Trying to assign undefined variable inside constructor
  • Thinking notify must be static
5. You want to make a ReportGenerator class that depends on a DataFetcher and a Logger. Which is the best way to apply dependency injection here?
hard
A. Pass both DataFetcher and Logger as constructor parameters and assign them to properties.
B. Create new DataFetcher and Logger objects inside ReportGenerator methods.
C. Use global variables for DataFetcher and Logger inside ReportGenerator.
D. Make ReportGenerator extend DataFetcher and Logger classes.

Solution

  1. Step 1: Understand multiple dependency injection

    When a class needs multiple dependencies, best practice is to pass them all via constructor parameters.
  2. Step 2: Evaluate options

    Pass both DataFetcher and Logger as constructor parameters and assign them to properties. correctly injects both dependencies. Create new DataFetcher and Logger objects inside ReportGenerator methods. creates dependencies inside, breaking injection. Use global variables for DataFetcher and Logger inside ReportGenerator. uses globals, which is bad practice. Make ReportGenerator extend DataFetcher and Logger classes. tries multiple inheritance which PHP does not support.
  3. Final Answer:

    Pass both DataFetcher and Logger as constructor parameters and assign them to properties. -> Option A
  4. Quick Check:

    Inject all dependencies via constructor [OK]
Hint: Inject all needed parts via constructor parameters [OK]
Common Mistakes:
  • Creating dependencies inside methods instead of injecting
  • Using global variables instead of injection
  • Trying to extend multiple classes in PHP
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard