# Lecture 2: PHP Object-Oriented Programming (OOP) - Preparing for Laravel **Duration:** 2-3 Hours **Trainer:** Fadi Ramzi Mohammed **Level:** Beginner to Intermediate **Tools Required:** VS Code + XAMPP (PHP 8.2 or higher) --- ## Objectives By the end of this lecture, trainees will: - Understand the fundamentals of Object-Oriented Programming (OOP) in PHP - Learn how OOP is used in modern PHP frameworks like Laravel - Practice writing classes, properties, methods, inheritance, and access modifiers - Prepare foundational OOP skills needed for Laravel controllers, models, and services --- ## ✅ What is OOP? OOP (Object-Oriented Programming) is a programming paradigm based on the concept of "objects" which contain data (properties) and behavior (methods). ### Real-life Analogy: Think of a **Car**: - Properties: color, brand, model - Behaviors: start(), accelerate(), brake() You can create multiple car **objects** based on the **Car class**. --- ## 🔸 1. Creating a Class and Object ### Syntax: ```php <?php class Car { public $brand; public $color; public function start() { echo "The car is starting."; } } $myCar = new Car(); $myCar->brand = "Toyota"; $myCar->color = "Red"; echo $myCar->brand; // Output: Toyota $myCar->start(); // Output: The car is starting. ?> ``` ### Explanation: - `class Car {}` defines a blueprint - `$myCar = new Car();` creates an object - `->` is used to access object properties/methods --- ## 🔸 2. Constructors (\_\_construct) ### Syntax: ```php <?php class User { public $name; public function __construct($name) { $this->name = $name; } public function greet() { echo "Hello, $this->name"; } } $user = new User("Fadi"); $user->greet(); // Hello, Fadi ?> ``` ### Explanation: - `__construct()` runs automatically when an object is created - `$this` refers to the current object --- ## 🔸 3. Access Modifiers: public, private, protected ### Example: ```php <?php class Account { public $owner; private $balance; public function __construct($owner, $balance) { $this->owner = $owner; $this->balance = $balance; } public function getBalance() { return $this->balance; } } $acc = new Account("Ali", 1000); echo $acc->getBalance(); // 1000 ?> ``` ### Explanation: - `public`: accessible anywhere - `private`: only accessible inside the same class - `protected`: accessible in the class and child classes --- ## 🔸 4. Inheritance ### Syntax: ```php <?php class Person { public $name; public function speak() { echo "$this->name is speaking."; } } class Employee extends Person { public $position; public function work() { echo "$this->name is working as a $this->position."; } } $emp = new Employee(); $emp->name = "Sara"; $emp->position = "Developer"; $emp->speak(); $emp->work(); ?> ``` ### Explanation: - `extends` allows class to inherit properties/methods from another - Useful to reduce code duplication --- ## 🔸 5. Encapsulation (Getters and Setters) ### Example: ```php <?php class BankAccount { private $balance = 0; public function deposit($amount) { if ($amount > 0) { $this->balance += $amount; } } public function getBalance() { return $this->balance; } } $account = new BankAccount(); $account->deposit(500); echo $account->getBalance(); // 500 ?> ``` ### Explanation: - Encapsulation hides internal data - Methods are used to safely access and modify properties --- ## 🔸 6. Class Constants and Static Methods ### Example: ```php <?php class AppConfig { const VERSION = "1.0"; public static function info() { echo "App version is " . self::VERSION; } } AppConfig::info(); ?> ``` ### Explanation: - `const` for constant values shared across all objects - `static` method can be called without creating an object - `self::` is used to access static properties/methods --- ## 🧠 Practice Exercises ### Task 1: Create a class `Product` with: - Properties: `name`, `price` - Constructor to set both - Method `printInfo()` to print product details ### Task 2: Create two classes: - `User`: with name and login() method - `Admin`: extends User, adds `accessLevel` and override `login()` to show different message ### Task 3: Create a `MathTool` class: - `static` method `add($a, $b)` and `multiply($a, $b)` - Call them without creating object --- ## 🔸 7. Laravel 12: Fresh Project Setup, Composer, and OOP Connection ### ✅ Why We Use Composer Composer is the **dependency manager** for PHP. Laravel depends on Composer to: - Download its framework and packages - Autoload PHP classes automatically (PSR-4) - Manage package versions and updates #### 🔧 Installing Composer (on Windows) 1. Go to https://getcomposer.org 2. Download **Composer-Setup.exe** 3. During installation, provide the PHP path: `C:\xampp\php\php.exe` 4. After installation, open CMD and verify: ```bash composer -V ### Create the project ``` composer create-project laravel/laravel my-platform-app "^12.0" cd my-platform-app php artisan serve ``` ### Laravel Routing, Controllers & OOP in Action What is Routing? Routing defines what should happen when a user visits a URL. Example: ```php // routes/web.php Route::get('/', function () { return view('welcome'); }); ``` This returns a Blade view when the user accesses /. #### 👉 Creating a Controller `php artisan make:controller ExpertController` Now edit app/Http/Controllers/HomeController.php: ```php // app/Http/Controllers/ExpertController.php namespace App\Http\Controllers; use Illuminate\Http\Request; class ExpertController extends Controller { public function profile() { return view('experts.profile'); } } ``` Update routes/web.php: ```php use App\Http\Controllers\ExpertController; Route::get('/expert/profile', [ExpertController::class, 'profile']); ``` ### OOP in Laravel: Models and Services Create a model: ``` php artisan make:model Product ``` php artisan make:model Expert -m This creates app/Models/Expert.php, representing the experts table. ```php // app/Models/Expert.php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Expert extends Model { protected $fillable = ['name', 'bio', 'category', 'price']; } ``` ## Resources - PHP Manual OOP: [https://www.php.net/manual/en/language.oop5.php](https://www.php.net/manual/en/language.oop5.php) - Laravel OOP Basics: [https://laravel.com/docs/12.x](https://laravel.com/docs/12.x) - Laracasts (OOP for Laravel): [https://laracasts.com](https://laracasts.com) --- Prepared by: Fadi Ramzi Date: 30-06-2025