PHP Learning Path Beginner to Advanced
A comprehensive guide to mastering PHP with focus on interview-critical concepts.
Table of Content
1. Getting Started with PHP Basics
- PHP Environment Setup
- Basic Syntax and Tags
- Variables and Constants
- Data Types
- Type Juggling and Type Casting
- Language Construct
2. Control Structures
- Conditional Statements
- Looping Structures
- break/continue Statements
- Alternative Syntax for Control Structures
3. Functions and Error Handling
- Function Declaration and Arguments
- Return Types and Type Declarations
- Variable Scope
- Error Types
- Error Handling
4. Working with Forms
- $_GET and $_POST Superglobals
- Form Validation and Sanitization
- File Uploads Handling
- CSRF Protection Basics
5. Object-Oriented PHP
- Classes and Objects
- Properties and Methods
- Inheritance and Polymorphism
- Magic Methods
- Interfaces vs Abstract Classes
- Traits and Namespaces
- Autoloading (PSR-4)
6. Database Interaction
- MySQLi vs PDO
- Prepared Statements
- Transactions and Error Handling
- ORM Basics
- Database Design Patterns
7. Security Practices
- SQL Injection Prevention
- XSS Prevention and Output Escaping
- Password Hashing
- Session Security
- HTTPS and Secure Cookies
- CORS and CSRF Protection
8. Advanced Concepts
- Composer and Dependency Management
- MVC Architecture Pattern
- RESTful API Development
- Middleware and Routing
- Caching Strategies
- PHP-FPM and Performance Tuning
9. Frameworks and Tools
- Laravel Fundamentals
- Symfony Components
- Testing (PHPUnit, Pest)
- Debugging (Xdebug, Ray)
- Deployment Strategies
10. PHP Internals
11. Best Practices
12. Interview Preparation
- Common PHP Interview Questions
- Algorithm Challenges in PHP
- Whiteboard Coding Tips
- System Design Concepts
- Real-world Scenario Questions
13. Projects and Practice
- E-commerce System
- REST API with Authentication
- CMS Implementation
- CLI Tool Development
- Microservices Architecture
14. Resources
1. Getting Started with PHP Basics
PHP Environment Setup
To start coding in PHP, you need a local development environment. Popular options include:
- XAMPP: A complete package with Apache, MySQL, and PHP.
- WAMP: Similar to XAMPP but for Windows.
- Docker: A containerized environment for consistent development.
<?php
phpinfo(); // Displays PHP configuration details
?>
Basic Syntax and Tags
PHP code is embedded within <?php
and ?>
tags. Example:
<?php
echo "Hello, World!";
?>
- Always end statements with a semicolon (
;
). - Comments can be added using
//
for single-line or/* */
for multi-line.
Variables and Constants
- Variables: Declared with a
$
sign (e.g.,$name = "John";
). - Constants: Defined using
define("CONST_NAME", "value")
orconst CONST_NAME = "value";
.
Data Types
PHP supports:
- Scalar Types:
int
,float
,string
,bool
. - Compound Types:
array
,object
. - Special Types:
null
,resource
.
int
Integers are whole numbers (positive/negative) without decimals. PHP uses 32/64-bit integers depending on the system.
<?php
$a = 42; // Decimal
$b = 0x1A; // Hexadecimal (26)
$c = 0b1010; // Binary (10)
$d = 0755; // Octal (493)
?>
Tricky Question:
Q: “Why does (int) '08'
return 0
instead of 8
?”
A: PHP parses numbers starting with 0
as octal, but 8
is invalid in octal (digits 0-7). Use (int) '8'
or intval('08', 10)
.
float
Floating-point numbers (decimals). Caution: Precision issues due to binary representation.
<?php
$a = 1.234;
$b = 10.0; // Float, not integer!
$c = 2.5e3; // 2500
?>
Tricky Question:
Q: “Why does 0.1 + 0.2 === 0.3
return false
?”
A: Floating-point precision errors. Use abs(0.1 + 0.2 - 0.3) < 1e-9
or bcadd()
for exact comparisons.
string
Textual data. Supports single quotes (no variable parsing) and double quotes (variable parsing).
<?php
$name = "Alice";
echo 'Hello, $name'; // Outputs "Hello, $name"
echo "Hello, $name"; // Outputs "Hello, Alice"
?>
Tricky Question:
Q: “What is the output of echo '5' + '2'
?”
A: 7
(PHP performs type juggling and converts strings to integers).
bool
Boolean (true
/false
). Falsy values: 0
, ""
, null
, empty arrays.
<?php
$isAdmin = true;
if ("0") { // Evaluates to false (string "0" is falsy)
// Won't execute
}
?>
Tricky Question:
Q: “Is 'false'
considered true
or false
?”
A: true
—non-empty strings are truthy, even if the content is “false”.
array
Ordered maps with key-value pairs.
Types of Array in PHP
-
Indexed Array:
$arr = ["Apple", "Banana", "Cherry"]; echo $arr[0]; // Apple
-
Associative Array:
$user = ["name" => "John", "age" => 25]; echo $user["name"]; // John
-
Multidimensional Array:
$store = [ "fruits" => ["Apple", "Banana"], "vegetables" => ["Carrot", "Spinach"] ]; echo $store["fruits"][1]; // Banana
Tricky Question:
Q: “What happens if you use array_push($arr, $item)
vs $arr[] = $item
?”
A: Both add elements, but array_push()
incurs function call overhead. Use []
for single elements.
object
Instances of classes. Use stdClass
for generic objects.
<?php
class User {}
$user = new User();
$user->name = "Alice";
$obj = (object) ["id" => 1]; // Cast array to object
?>
Tricky Question: Q: “How are objects passed to functions in PHP?” A: By reference (but explicit cloning is needed to create copies).
null
Represents “no value”. Variables are null
if unset or assigned null
.
<?php
$x = null;
if (is_null($x)) {
echo "x is null";
}
?>
Tricky Question:
Q: “What’s the difference between isset($var)
and !is_null($var)
?”
A: isset()
checks if a variable exists and is not null
. !is_null()
throws a warning if the variable doesn’t exist.
resource
Special variables holding references to external resources (e.g., files, databases).
<?php
$file = fopen("test.txt", "r"); // Returns a file resource
?>
Tricky Question: Q: “What happens if you serialize a resource?” A: Serialization fails—resources can’t be serialized as they’re pointers to external states.
Key Takeaways for Interviews:
- Weak Typing: PHP converts types implicitly (e.g.,
"5"
→5
in arithmetic). - Array Flexibility: Arrays can act as lists, dictionaries, stacks, etc.
- Null Handling: Use
=== null
for strict checks. - Resource Limitations: Resources are temporary handles (e.g., database connections must be closed explicitly).
Type Juggling and Type Casting
- Type Juggling: PHP automatically converts types (e.g.,
"5" + 2
results in7
). - Type Casting: Explicitly convert types using
(int)
,(string)
, etc.
Language Constructs in PHP
Language constructs in PHP are built-in functions or statements that do not require parentheses (although they can be used with them). These constructs behave like functions but are part of PHP’s core syntax.
Types of Language Constructs in PHP
Language constructs fall under different categories based on their functionality.
1. Variable and Type Handling Constructs
Construct | Description |
---|---|
isset() |
Returns true if a variable is set and not NULL |
unset() |
Destroys a variable |
empty() |
Returns true if a variable is empty (0, "", NULL, false, [] ) |
die() or exit() |
Terminates the script execution |
eval() |
Executes a string as PHP code |
2. Output and Debugging Constructs
Construct | Description |
---|---|
echo |
Outputs one or more strings (faster than print ) |
print |
Outputs a string (returns 1 , unlike echo ) |
print_r() |
Prints human-readable information about a variable |
var_dump() |
Dumps detailed information about a variable |
var_export() |
Outputs a parsable string representation of a variable |
3. Control Structures (Conditional & Loop Constructs)
Construct | Description |
---|---|
if , else , elseif |
Conditional statements |
switch , case , default |
Multi-way conditional statement |
while , do-while |
Looping constructs |
for , foreach |
Iteration constructs |
break |
Exits the current loop |
continue |
Skips the current loop iteration |
return |
Returns a value from a function |
4. Function and Class Handling Constructs
Construct | Description |
---|---|
function |
Defines a function |
global |
Declares global variables inside functions |
static |
Declares static variables inside functions |
use |
Imports namespaces or traits in PHP |
class , interface , trait |
Defines object-oriented components |
extends , implements |
Establishes inheritance in classes |
abstract , final |
Defines class behavior |
clone |
Creates a copy of an object |
5. File and Directory Constructs
Construct | Description |
---|---|
include |
Includes and executes a file (produces a warning if the file is missing) |
require |
Includes and executes a file (produces a fatal error if the file is missing) |
include_once |
Ensures a file is included only once |
require_once |
Ensures a file is required only once |
6. Exception Handling Constructs
Construct | Description |
---|---|
try , catch , finally |
Exception handling mechanism |
throw |
Throws an exception |
7. Miscellaneous Constructs
Construct | Description |
---|---|
list() |
Assigns variables from an array |
array() |
Creates an array (alternative to [] ) |
isset() |
Checks if a variable is set |
unset() |
Unsets a variable |
declare() |
Sets execution directives (used with ticks ) |
goto |
Jumps to a specific label in the script (not recommended) |
Why Are Language Constructs Different from Functions?
- They are part of PHP’s core syntax, not user-defined functions.
- Parentheses are optional in most cases.Example:
echo "Hello"; // Valid echo("Hello"); // Also valid
- They are faster than functions because they do not require function call overhead.
Conclusion
- PHP has several language constructs grouped under control structures, file handling, function handling, output handling, and more.
- Unlike functions, language constructs do not always require parentheses.
2. Control Structures
Conditional Statements
- if/else: Execute code based on conditions.
if ($age > 18) {
echo "Adult";
} else {
echo "Minor";
}
- switch: Compare a value against multiple cases.
Looping Structures
- for: Iterate a fixed number of times.
- while: Loop while a condition is true.
- foreach: Iterate over arrays or objects.
break/continue Statements
- break: Exit a loop.
- continue: Skip to the next iteration.
Alternative Syntax for Control Structures
Use :
and end
for cleaner control structures in templates:
<?php if ($loggedIn): ?>
<p>Welcome back!</p>
<?php endif; ?>
3. Functions and Error Handling
Function Declaration and Arguments
Define functions with the function
keyword:
function greet($name) {
return "Hello, $name!";
}
Return Types and Type Declarations
Specify return types for type safety:
function add(int $a, int $b): int {
return $a + $b;
}
Variable Scope
- Local: Variables inside functions.
- Global: Accessible anywhere using
global
keyword. - Static: Retains value between function calls.
Types of Function Calls in PHP
1. Call by Value (Default Behavior)
- When a function is called by value, a copy of the variable is sent to the function.
- Any changes made inside the function do not affect the original variable.
Example:
<?php
function callByValue($num) {
$num += 10; // Modify the local copy
echo "Inside function: $num\n";
}
$value = 20;
callByValue($value);
echo "Outside function: $value\n"; // Original value remains unchanged
?>
Output:
Inside function: 30
Outside function: 20
📌 Explanation: The function receives a copy of $value
, so modifying it inside does not change the original $value
.
2. Call by Reference
- When you use
&
(ampersand) before a parameter, the function works with the original variable’s memory reference. - Any changes inside the function affect the original variable.
Example:
<?php
function callByReference(&$num) {
$num += 10; // Modify the original variable
echo "Inside function: $num\n";
}
$value = 20;
callByReference($value);
echo "Outside function: $value\n"; // Original value is changed
?>
Output:
Inside function: 30
Outside function: 30
📌 Explanation: Since we used &$num
, the function modifies the actual $value
, not a copy.
Global Scope
<?php
// Using Global Variable
$globalNum = 50;
function usingGlobal() {
global $globalNum; // Access the global variable
$globalNum += 20;
echo "Inside usingGlobal: $globalNum<br>";
}
// Static Variable Example
function staticExample() {
static $count = 0; // Static variable retains value across function calls
$count++;
echo "Static count: $count<br>";
}
usingGlobal();
echo "Outside usingGlobal: $globalNum<br><br>";
staticExample();
staticExample();
staticExample();
?>
Answer
Inside usingGlobal: 70
Outside usingGlobal: 70
Static count: 1
Static count: 2
Static count: 3
Default Argument Value
- You can assign a default value to function parameters. If an argument is not provided, the default value is used.
Example:
<?php
function greet($name = "Guest") {
echo "Hello, $name!\n";
}
greet(); // Uses default value "Guest"
greet("Manish"); // Overrides default value
?>
Output:
Hello, Guest!
Hello, Manish!
📌 Explanation: If no argument is passed, "Guest"
is used as the default value.
4. Type Hinting
- You can specify the expected type of arguments in PHP (since PHP 7).
- If a wrong type is passed, PHP throws an error.
Example:
<?php
function sum(int $a, int $b) {
return $a + $b;
}
echo sum(5, 10); // Works fine
echo sum("5", "10"); // Works, as PHP auto-converts strings to int
// echo sum("five", "ten"); // Fatal error!
?>
📌 Explanation:
int $a, int $b
ensures only integers are passed."5"
is converted to5
, but"five"
would cause an error.
Conclusion
The function call on line 8 is Call by Value, as arguments are passed without a reference (&
). You can change it to Call by Reference by adding &
before the parameters in the function definition.
Error Types
- Notice: Non-critical issues.
- Warning: Potential problems.
- Fatal: Critical errors that stop execution.
Error Handling
Use try/catch
for exceptions:
try {
// Code that may throw an exception
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
}
4. Working with Forms
$_GET
and $_POST
Superglobals
$_GET
: Retrieve Data from URL Parameters
$_GET
is used to collect data sent via URL parameters (query strings). It is commonly used for search forms or pagination.
Example:
// URL: http://example.com/?name=John&age=25
if (isset($_GET['name']) && isset($_GET['age'])) {
$name = $_GET['name']; // John
$age = $_GET['age']; // 25
echo "Name: $name, Age: $age";
}
Key Points:
- Data is visible in the URL.
- Limited to 2048 characters (browser-dependent).
- Use for non-sensitive data.
$_POST
: Retrieve Data from Form Submissions
$_POST
is used to collect data sent via HTTP POST requests, typically from HTML forms. It is more secure than $_GET
for sensitive data.
Example:
// HTML Form
<form method="POST" action="process.php">
<input type="text" name="username">
<input type="password" name="password">
<button type="submit">Submit</button>
</form>
// process.php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = $_POST['username'];
$password = $_POST['password'];
echo "Username: $username, Password: $password";
}
Key Points:
- Data is not visible in the URL.
- Suitable for sensitive data like passwords.
- No size limitation (unlike
$_GET
).
Form Validation and Sanitization
Form validation ensures that user inputs meet specific criteria, while sanitization cleans the data to prevent security risks like XSS (Cross-Site Scripting).
Example:
$errors = [];
// Validate and sanitize input
if (empty($_POST['name'])) {
$errors[] = "Name is required.";
} else {
$name = htmlspecialchars($_POST['name']); // Sanitize input
}
if (empty($_POST['email'])) {
$errors[] = "Email is required.";
} elseif (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
$errors[] = "Invalid email format.";
} else {
$email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); // Sanitize email
}
if (empty($errors)) {
echo "Name: $name, Email: $email";
} else {
foreach ($errors as $error) {
echo "<p>$error</p>";
}
}
Key Points:
- Use
htmlspecialchars()
to prevent XSS. - Use
filter_var()
for validation and sanitization. - Always validate server-side, even if client-side validation exists.
File Uploads Handling
PHP uses the $_FILES
superglobal to handle file uploads. It provides information about the uploaded file, such as its name, size, and temporary location.
Example:
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
$file = $_FILES['file'];
// Check for errors
if ($file['error'] === UPLOAD_ERR_OK) {
$uploadDir = 'uploads/';
$uploadPath = $uploadDir . basename($file['name']);
// Move the file to the upload directory
if (move_uploaded_file($file['tmp_name'], $uploadPath)) {
echo "File uploaded successfully!";
} else {
echo "Failed to move the file.";
}
} else {
echo "Error during file upload.";
}
}
Key Points:
- Always validate file types and sizes.
- Use
move_uploaded_file()
to move the file to a permanent location. - Set proper permissions for the upload directory.
CSRF Protection Basics
CSRF (Cross-Site Request Forgery) attacks trick users into performing actions they didn’t intend to. To prevent this, use CSRF tokens.
Example:
// Generate a CSRF token
session_start();
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
// HTML Form
<form method="POST" action="process.php">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
<input type="text" name="username">
<button type="submit">Submit</button>
</form>
// process.php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die("CSRF token validation failed.");
}
// Process the form data
echo "Form submitted successfully!";
}
Key Points:
- Generate a unique token for each session.
- Include the token in forms as a hidden field.
- Validate the token on form submission.
Summary of Key Concepts:
$_GET
: Use for non-sensitive data passed via URLs.$_POST
: Use for sensitive data submitted via forms.- Form Validation and Sanitization: Ensure data is clean and valid.
- File Uploads: Handle files securely using
$_FILES
. - CSRF Protection: Use tokens to prevent unauthorized form submissions.
These topics are critical for PHP interviews and real-world applications. Practice these concepts with code examples to solidify your understanding!
5. Object-Oriented PHP
1. Classes and Objects
Class
A class is a blueprint for creating objects. It defines properties (variables) and methods (functions) that the objects will have.
Object
An object is an instance of a class. It can access the properties and methods defined in the class.
class Car {
// Property
public $model;
// Method
public function startEngine() {
return "Engine started!";
}
}
// Create an object
$tesla = new Car();
$tesla->model = "Model S";
echo $tesla->startEngine(); // Output: Engine started!
Key Points for Interviews:
- Use
new
keyword to instantiate objects. - Objects encapsulate data and behavior.
2. Properties and Methods
Properties
Variables declared inside a class. They hold the object’s state.
Methods
Functions declared inside a class. They define the object’s behavior.
class BankAccount {
// Property (with visibility)
private $balance = 0;
// Method to modify property
public function deposit($amount) {
$this->balance += $amount;
}
public function getBalance() {
return $this->balance;
}
}
$account = new BankAccount();
$account->deposit(100);
echo $account->getBalance(); // Output: 100
Key Points:
- Visibility: Use
public
,private
, orprotected
. $this
refers to the current object.
3. Inheritance and Polymorphism
Inheritance
A child class inherits properties and methods from a parent class.
Polymorphism
Child classes can override parent methods to provide specific implementations.
class Vehicle {
public function start() {
return "Vehicle started!";
}
}
class Car extends Vehicle {
// Override parent method
public function start() {
return "Car engine started!";
}
}
$vehicle = new Vehicle();
echo $vehicle->start(); // Output: Vehicle started!
$car = new Car();
echo $car->start(); // Output: Car engine started!
Interview Tip:
- Explain the Liskov Substitution Principle (child classes should be substitutable for parent classes).
4. Magic Methods
Magic methods in PHP are special methods that begin with double underscores (__
) and allow you to control various behaviors of your objects. Many of these methods interact with the properties of your object—whether to initialize them, control access, or modify them during serialization. Below is a list of key magic methods, their purposes, and code examples.
1. __construct
and __destruct
__construct
: Called automatically when a new object is created. Often used to initialize properties.__destruct
: Called when an object is destroyed. Useful for cleanup tasks.
Example:
<?php
class MagicDemo {
public $data;
public function __construct() {
echo "__construct called\n";
// Initialize object properties
$this->data = ['name' => 'MagicDemo', 'version' => '1.0'];
}
public function __destruct() {
echo "__destruct called\n";
}
}
$demo = new MagicDemo();
?>
##—
2. __get
, __set
, __isset
, and __unset
These methods control access to inaccessible or non-existing properties.
__get($name)
: Invoked when reading a property that isn’t accessible.__set($name, $value)
: Invoked when writing to an inaccessible property.__isset($name)
: Invoked when calling isset() or empty() on an inaccessible property.__unset($name)
: Invoked when unset() is used on an inaccessible property.
Example:
<?php
class MagicProperties {
// Private property to store data
private $data = [];
public function __get($name) {
echo "__get: accessing '$name'\n";
return isset($this->data[$name]) ? $this->data[$name] : null;
}
public function __set($name, $value) {
echo "__set: setting '$name' to '$value'\n";
$this->data[$name] = $value;
}
public function __isset($name) {
echo "__isset: checking if '$name' is set\n";
return isset($this->data[$name]);
}
public function __unset($name) {
echo "__unset: unsetting '$name'\n";
unset($this->data[$name]);
}
}
$obj = new MagicProperties();
$obj->name = "PHP Magic"; // Calls __set
echo $obj->name . "\n"; // Calls __get
if (isset($obj->name)) { // Calls __isset
echo "Property 'name' is set\n";
}
unset($obj->name); // Calls __unset
?>
3. __call
and __callStatic
__call_(arguments)
: Invoked when calling an undefined or inaccessible instance method.__callStatic_(arguments)
: Invoked when calling an undefined or inaccessible static method.
Example:
<?php
class MagicMethodCalls {
public function __call($name, $arguments) {
echo "__call: Attempt to call instance method '$name' with arguments: " . implode(', ', $arguments) . "\n";
}
public static function __callStatic($name, $arguments) {
echo "__callStatic: Attempt to call static method '$name' with arguments: " . implode(', ', $arguments) . "\n";
}
}
$obj = new MagicMethodCalls();
$obj->nonExistentMethod("arg1", "arg2"); // Triggers __call
MagicMethodCalls::nonExistentStatic("staticArg"); // Triggers __callStatic
?>
4. __sleep
and __wakeup
These methods handle the serialization and unserialization of objects.
__sleep()
: Called when serialize() is used. It can return an array of property names to be serialized.__wakeup()
: Called when unserialize() is used. It can be used to reinitialize resources.
Example:
<?php
class SerializableDemo {
public $data = "Some data";
private $tempResource;
public function __sleep() {
echo "__sleep called\n";
// Return only the properties you wish to serialize
return ['data'];
}
public function __wakeup() {
echo "__wakeup called\n";
// Reinitialize properties or resources (e.g., database connection)
$this->tempResource = "Reinitialized resource";
}
}
$object = new SerializableDemo();
$serialized = serialize($object); // Triggers __sleep
$unserialized = unserialize($serialized); // Triggers __wakeup
?>
5. __toString
Allows an object to be treated as a string. This method must return a string.
Example:
<?php
class Stringable {
private $data = ['name' => 'Stringable Demo', 'version' => '2.0'];
public function __toString() {
return "__toString: " . json_encode($this->data);
}
}
$obj = new Stringable();
echo $obj; // Automatically calls __toString
?>
6. __invoke
Invoked when an object is called as a function.
Example:
<?php
class CallableDemo {
public function __invoke(...$args) {
echo "__invoke called with arguments: " . implode(', ', $args) . "\n";
}
}
$obj = new CallableDemo();
$obj("first", "second"); // Treats $obj as a function, calling __invoke
?>
7. __set_state
Called when the object is exported with var_export()
. It allows the recreation of an object with the given state.
Example:
<?php
class StateDemo {
public $data;
public function __construct($data = null) {
$this->data = $data;
}
public static function __set_state($array) {
echo "__set_state called\n";
$obj = new self();
$obj->data = $array['data'];
return $obj;
}
}
$state = var_export(new StateDemo("test state"), true);
echo $state;
?>
8. __clone
Invoked when an object is cloned using the clone
keyword. It is useful for performing deep copies or resetting properties.
Example:
<?php
class CloneDemo {
public $data;
public function __construct($data) {
$this->data = $data;
}
public function __clone() {
echo "__clone called\n";
// Example: reset a property after cloning
$this->data = "Cloned: " . $this->data;
}
}
$original = new CloneDemo("Original Data");
$cloned = clone $original;
echo $cloned->data; // Output includes the modification from __clone
?>
9. __debugInfo
Controls what information is shown when using debugging functions like var_dump()
.
Example:
<?php
class DebugDemo {
private $data = "Secret Data";
private $hidden = "Hidden Info";
public function __debugInfo() {
return [
'data' => $this->data,
// 'hidden' is omitted from the debug info
];
}
}
$obj = new DebugDemo();
var_dump($obj); // Only shows 'data' property
?>
10. __serialize
and __unserialize
(PHP 7.4+)
Newer magic methods for serialization that offer more control than __sleep
and __wakeup
.
__serialize()
: Returns an array of data to be serialized.__unserialize()
: Reconstructs the object from the serialized array.
Example:
<?php
class NewSerializableDemo {
private $data;
private $tempResource;
public function __construct($data) {
$this->data = $data;
$this->tempResource = "Resource";
}
public function __serialize(): array {
echo "__serialize called\n";
return ['data' => $this->data];
}
public function __unserialize(array $data): void {
echo "__unserialize called\n";
$this->data = $data['data'];
$this->tempResource = "Reinitialized Resource";
}
}
$obj = new NewSerializableDemo("New Data");
$serialized = serialize($obj); // Uses __serialize
$unserialized = unserialize($serialized); // Uses __unserialize
?>
Interview Question:
- Q: Why use
__construct
over a regular method? - A: Ensures initialization logic runs automatically when objects are created.
5. Interfaces vs Abstract Classes
Interfaces
- Define method signatures (what to do).
- No implementation.
- A class can implement multiple interfaces.
Abstract Classes
- Provide partial implementation.
- Can have properties and concrete methods.
- A class can extend only one abstract class.
// Interface
interface Movable {
public function move();
}
// Abstract Class
abstract class Animal {
abstract public function makeSound(); // Must be implemented
public function eat() {
echo "Eating...";
}
}
class Dog extends Animal implements Movable {
public function makeSound() {
echo "Woof!";
}
public function move() {
echo "Dog is running!";
}
}
$dog = new Dog();
$dog->move(); // Output: Dog is running!
Key Differences:
Interface | Abstract Class | |
---|---|---|
Implementation | Only method signatures | Partial implementation allowed |
Inheritance | Multiple interfaces | Single abstract class |
6. Traits and Namespaces
Traits
Reusable code units that solve single inheritance limitations.
trait Loggable {
public function log($message) {
echo "Log: $message";
}
}
class User {
use Loggable; // Include the trait
}
$user = new User();
$user->log("User created"); // Output: Log: User created
Namespaces
Organize code and prevent naming collisions.
namespace Database;
class Connection {
public function connect() {
return "Connected to DB!";
}
}
// Usage
$conn = new \Database\Connection();
echo $conn->connect(); // Output: Connected to DB!
Interview Tip:
- Use traits for cross-cutting concerns (e.g., logging).
- Namespaces follow PSR-4 autoloading standards.
7. Autoloading (PSR-4)
Automatically load classes without require
statements.
Step 1: Directory Structure
src/
└── Models/
└── User.php
Step 2: composer.json
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
Step 3: Class Definition
// src/Models/User.php
namespace App\Models;
class User {
public function __construct() {
echo "User loaded!";
}
}
Step 4: Usage
require 'vendor/autoload.php';
$user = new \App\Models\User(); // Output: User loaded!
Interview Question:
- Q: Why use PSR-4 autoloading?
- A: Standardizes class-to-file mapping, reduces manual includes, and improves maintainability.
💡 Key OOP Interview Topics
- Encapsulation: Hide internal state using
private
/protected
properties. - Abstraction: Simplify complexity using interfaces/abstract classes.
- Composition over Inheritance: Favor object composition for flexibility.
- Dependency Injection: Pass dependencies to objects instead of hardcoding.
// Dependency Injection Example
class Logger {
public function log($message) {
echo $message;
}
}
class UserService {
private $logger;
public function __construct(Logger $logger) {
$this->logger = $logger;
}
}
$logger = new Logger();
$userService = new UserService($logger);
📚 Resources
- PHP OOP Official Docs
- Book: “PHP Objects, Patterns, and Practice” by Matt Zandstra
⬆ Back to Top
6. Database Interaction
MySQLi vs PDO
MySQLi
MySQL-specific extension for interacting with MySQL databases.
// MySQLi Connection
$mysqli = new mysqli("localhost", "user", "password", "database");
if ($mysqli->connect_error) {
die("Connection failed: " . $mysqli->connect_error);
}
PDO (PHP Data Objects)
Database-agnostic extension supporting 12+ databases (MySQL, PostgreSQL, SQLite, etc.).
// PDO Connection
try {
$pdo = new PDO("mysql:host=localhost;dbname=database", "user", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("Connection failed: " . $e->getMessage());
}
Key Differences:
Feature | MySQLi | PDO |
---|---|---|
Database Support | MySQL only | Multiple databases |
Prepared Statements | Procedural & Object-oriented | Object-oriented only |
Error Handling | Limited | Exceptions & error codes |
Prepared Statements
Prevent SQL injection by separating SQL logic from data.
Example with MySQLi:
$stmt = $mysqli->prepare("SELECT * FROM users WHERE email = ?");
$stmt->bind_param("s", $email); // "s" = string type
$stmt->execute();
$result = $stmt->get_result();
Example with PDO:
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->execute([':id' => $id]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
Interview Tip:
- Always use prepared statements for user inputs.
- Explain SQL injection and how prepared statements mitigate it.
Transactions and Error Handling
Ensure atomicity for multiple database operations.
try {
$pdo->beginTransaction();
// Transfer $100 from Alice to Bob
$pdo->exec("UPDATE accounts SET balance = balance - 100 WHERE user = 'Alice'");
$pdo->exec("UPDATE accounts SET balance = balance + 100 WHERE user = 'Bob'");
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
echo "Transaction failed: " . $e->getMessage();
}
Key Points:
- Use
beginTransaction()
,commit()
, androllBack()
. - Transactions ensure ACID properties (Atomicity, Consistency, Isolation, Durability).
ORM Basics
Object-Relational Mapping (ORM) maps database tables to PHP objects.
Example with Eloquent (Laravel):
// Define a Model
class User extends Illuminate\Database\Eloquent\Model {
protected $table = 'users';
}
// Fetch a user
$user = User::find(1);
echo $user->name;
// Create a user
User::create(['name' => 'Alice', 'email' => 'alice@example.com']);
Popular ORMs:
- Eloquent (Laravel)
- Doctrine (Symfony)
Advantages:
- Abstracts SQL queries.
- Simplifies database operations.
Database Design Patterns
Active Record Pattern
Objects carry data and database access logic.
class User {
public $id;
public $name;
public function save() {
// Save to database
}
}
Repository Pattern
Separates data access logic from business logic.
class UserRepository {
public function findById($id) {
// Fetch user from DB
}
public function save(User $user) {
// Save user to DB
}
}
Comparison:
Pattern | Use Case |
---|---|
Active Record | Simple apps with direct DB access |
Repository | Complex apps with layered architecture |
💡 Key Interview Questions
- Q: Why use PDO over MySQLi?A: PDO supports multiple databases and provides better error handling.
- Q: How do transactions prevent data corruption?A: They ensure all operations succeed or fail together.
- Q: What is the N+1 problem in ORM? A: Excessive queries due to lazy loading (fix: eager loading).
7. Security Practices
SQL Injection Prevention
Use prepared statements and parameterized queries.
XSS Prevention and Output Escaping
Escape output using htmlspecialchars()
.
Password Hashing
Hash passwords with password_hash()
and verify with password_verify()
.
Session Security
Regenerate session IDs and use secure cookies.
HTTPS and Secure Cookies
Enforce HTTPS and set cookie flags like Secure
and HttpOnly
.
CORS and CSRF Protection
Implement CORS headers and CSRF tokens.
8. Advanced Concepts
Composer and Dependency Management
Manage dependencies using Composer.
MVC Architecture Pattern
Build applications using Model-View-Controller.
RESTful API Development
Create REST APIs with proper HTTP methods and status codes.
Middleware and Routing
Implement middleware and routing in frameworks.
Caching Strategies
Use OPcache, Redis, and other caching tools.
PHP-FPM and Performance Tuning
Optimize PHP performance with PHP-FPM.
9. Frameworks and Tools
Laravel Fundamentals
Learn Laravel’s Eloquent ORM, Blade templating, and Artisan CLI.
Symfony Components
Use Symfony components like HttpFoundation and DependencyInjection.
Testing (PHPUnit, Pest)
Write tests with PHPUnit and Pest.
Debugging (Xdebug, Ray)
Debug applications with Xdebug and Ray.
Deployment Strategies
Deploy PHP applications using CI/CD pipelines.
10. PHP Internals
Zend Engine Basics
Understand the core of PHP’s execution engine.
Memory Management
Learn how PHP manages memory allocation.
Opcode Caching
Use OPcache to improve performance.
Garbage Collection
Understand PHP’s garbage collection mechanism.
PHP Lifecycle
Explore the lifecycle of a PHP request.
11. Best Practices
PSR Standards
Follow PSR-1, PSR-12, and other coding standards.
SOLID Principles
- S - Single Responsibility Principle
- O - Open/Closed Principle
- L - Liskov Substitution Principle
- I - Interface Segregation Principle
- D - Dependency Inversion Principle
1. Single Responsibility Principle
class User {
public function saveToDatabase() {
// Save logic
}
}
Design Patterns
Implement patterns like Singleton, Factory, and Observer.
Code Documentation
Write PHPDoc comments for better code understanding.
Performance Optimization
Optimize PHP code and database queries.
12. Interview Preparation
Common PHP Interview Questions
Prepare for frequently asked PHP interview questions.
Algorithm Challenges in PHP
Solve problems like reversing strings or finding duplicates.
Whiteboard Coding Tips
Practice coding on a whiteboard or paper.
System Design Concepts
Design scalable systems like e-commerce platforms.
Real-world Scenario Questions
Answer scenario-based questions about PHP applications.
13. Projects and Practice
E-commerce System
Build a full-featured e-commerce platform.
REST API with Authentication
Create a secure REST API with JWT authentication.
CMS Implementation
Develop a content management system.
CLI Tool Development
Build command-line tools for automation.
Microservices Architecture
Design and implement microservices.
14. Resources
Official PHP Documentation
Refer to the official PHP manual.
PHP: The Right Way
Follow best practices from “PHP: The Right Way.”
Recommended Books
Read books like “Modern PHP” and “PHP Objects, Patterns, and Practice.”
Learning Platforms
Use platforms like Laracasts and PHP School.
Community Blogs
Follow blogs like PHP.net and Sitepoint.