Dependency Injection means giving an object what it needs instead of making it create those things itself. It helps keep code clean and easy to change.
Click to reveal answer
beginner
Why is Dependency Injection useful?
It makes code easier to test, change, and reuse because parts don’t depend tightly on each other. You can swap parts without changing the whole system.
Click to reveal answer
intermediate
In PHP, what is a common way to implement Dependency Injection?
You pass the needed objects as parameters to a class constructor or method instead of creating them inside the class.
Click to reveal answer
intermediate
What is the difference between Dependency Injection and Service Locator?
Dependency Injection gives dependencies directly to a class, while Service Locator asks a central place to get dependencies. DI is clearer and easier to test.
Click to reveal answer
beginner
Show a simple PHP example of Dependency Injection using constructor injection.
class Logger {
public function log($msg) {
echo $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();
Click to reveal answer
What does Dependency Injection help to achieve in code?
ALoose coupling between components
BHard coding dependencies inside classes
CMaking code run faster
DAvoiding use of objects
✗ Incorrect
Dependency Injection helps make components less dependent on each other, which is called loose coupling.
Which of these is a common way to inject dependencies in PHP?
AUsing global variables
BPassing dependencies via constructor
CCreating dependencies inside methods
DUsing static methods only
✗ Incorrect
Passing dependencies through the constructor is a common and clean way to do Dependency Injection in PHP.
What is NOT a benefit of Dependency Injection?
ATighter coupling
BEasier testing
CBetter code reuse
DSimpler maintenance
✗ Incorrect
Dependency Injection reduces coupling, it does not make it tighter.
In Dependency Injection, who is responsible for creating the dependencies?
AThe operating system
BThe dependent class itself
CThe PHP interpreter
DThe dependency injection container or caller
✗ Incorrect
Dependencies are created outside and passed in, often by a container or the code that uses the class.
Which pattern is considered clearer and easier to test?
AService Locator
BSingleton
CDependency Injection
DFactory
✗ Incorrect
Dependency Injection is clearer and easier to test compared to Service Locator.
Explain Dependency Injection and why it is helpful in PHP programming.
Think about how objects get what they need without creating it themselves.
You got /3 concepts.
Describe how you would implement Dependency Injection in a PHP class with an example.
Focus on how dependencies are passed in and used inside the class.
You got /3 concepts.
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
Step 1: Understand dependency injection meaning
Dependency injection means giving a class the objects it needs from outside, not creating them inside the class.
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.
Final Answer:
Providing a class with its required objects from outside instead of creating them inside. -> Option A
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; }
Constructor injection requires passing the dependency as a parameter and assigning it to a class property.
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 '=='.
Final Answer:
public function __construct(Database $db) { $this->db = $db; } -> Option C
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
Step 1: Understand dependency injection in code
The User class receives a Logger object via constructor and stores it in $this->logger.
Step 2: Trace method calls
Calling $user->create() calls $this->logger->log('User created'), which echoes "Log: User created".
Final Answer:
Log: User created -> Option B
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
Step 1: Check constructor parameters
The constructor has no parameters but tries to assign $mailer which is undefined inside it.
Step 2: Identify missing injection
Mailer object should be passed as a parameter to constructor and assigned to $this->mailer.
Final Answer:
The constructor does not accept Mailer as a parameter to inject. -> Option D
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
Step 1: Understand multiple dependency injection
When a class needs multiple dependencies, best practice is to pass them all via constructor parameters.
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.
Final Answer:
Pass both DataFetcher and Logger as constructor parameters and assign them to properties. -> Option A
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 unknownstrongwhile earning +1 Grip toward your certificate.