<?php
// File: src/Models/User.php
namespace App\Models;
class User {
public function __construct(public string $name, public string $email) {}
public function getInfo(): string { return "{$this->name} <{$this->email}>"; }
}
// File: src/Models/Post.php
namespace App\Models; // same namespace OK
class Post {
public function __construct(public string $title) {}
}
// File: src/Services/UserService.php
namespace App\Services;
use App\Models\User; // import class
use App\Models\Post as PostModel; // alias
class UserService {
private array $users = [];
public function create(string $name, string $email): User {
$user = new User($name, $email); // use imported class
$this->users[] = $user;
return $user;
}
public function findByEmail(string $email): ?User {
foreach ($this->users as $user) {
if ($user->email === $email) return $user;
}
return null;
}
}
// File: index.php (root)
namespace App; // or global namespace
use App\Services\UserService;
use App\Models\User;
use PDO; // global class — need \ prefix or use statement
$service = new UserService();
$user = $service->create("Ko Ko", "ko@example.com");
echo $user->getInfo(); // "Ko Ko <ko@example.com>"
// PSR-4 Folder structure → Namespace mapping
//
// src/
// Models/
// User.php → namespace App\Models; class User
// Product.php → namespace App\Models; class Product
// Services/
// UserService.php → namespace App\Services; class UserService
// EmailService.php → namespace App\Services; class EmailService
// Repositories/
// UserRepository.php→ namespace App\Repositories; class UserRepository
// Http/
// Controllers/
// UserController.php → namespace App\Http\Controllers; class UserController
// Exceptions/
// AppException.php → namespace App\Exceptions; class AppException
// Multiple use statements
use App\Models\{User, Product, Order}; // group import
use App\Services\{UserService, EmailService}; // group import
use function App\Helpers\formatDate; // import function
use const App\Config\APP_VERSION; // import constant
// Full qualified name (no use needed)
$user = new \App\Models\User("Ko Ko", "ko@example.com");
# Install Composer (Windows)
# Download: https://getcomposer.org/installer
# Create new project
composer init
# OR
composer create-project laravel/laravel myapp
# Install packages
composer require guzzlehttp/guzzle # HTTP client
composer require vlucas/phpdotenv # .env files
composer require monolog/monolog # logging
composer require phpmailer/phpmailer # email
# Dev dependencies (testing, debugging)
composer require --dev phpunit/phpunit
composer require --dev fakerphp/faker # fake data
# composer.json (auto-created)
{
"name": "myname/myapp",
"require": {
"php": "^8.1",
"guzzlehttp/guzzle": "^7.0",
"vlucas/phpdotenv": "^5.0"
},
"require-dev": {
"phpunit/phpunit": "^10.0"
},
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
# Update after editing composer.json
composer dump-autoload
# Install from existing composer.json
composer install
# Update packages
composer update
<?php
// Without Composer — manual require (BAD)
require_once 'src/Models/User.php';
require_once 'src/Models/Product.php';
require_once 'src/Services/UserService.php';
// ... hundreds of files!
// With Composer autoload — ONE line!
require_once 'vendor/autoload.php';
// Now ALL classes in src/ are available automatically!
use App\Models\User;
use App\Services\UserService;
$service = new UserService();
$user = new User("Ko Ko", "ko@example.com");
// PHP automatically finds and loads the files!
// Custom autoloader (without Composer)
spl_autoload_register(function(string $className) {
// App\Models\User → src/Models/User.php
$path = str_replace(['App\\', '\\'], ['src/', '/'], $className) . '.php';
if (file_exists($path)) {
require_once $path;
}
});
<?php
require_once 'vendor/autoload.php';
// Using Guzzle HTTP client
use GuzzleHttp\Client;
$client = new Client(['base_uri' => 'https://jsonplaceholder.typicode.com']);
$response = $client->get('/users/1');
$user = json_decode($response->getBody(), true);
echo $user['name']; // "Leanne Graham"
// Using dotenv
use Dotenv\Dotenv;
$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();
$dbHost = $_ENV['DB_HOST']; // from .env file
$dbPass = $_ENV['DB_PASSWORD'];
// Using Monolog logger
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
$log = new Logger('app');
$log->pushHandler(new StreamHandler('logs/app.log', Logger::WARNING));
$log->warning("Low disk space");
$log->error("Database connection failed", ['host' => $dbHost]);
// Using Faker (dev/testing)
use Faker\Factory;
$faker = Factory::create();
echo $faker->name(); // "John Doe"
echo $faker->email(); // "ko@example.org"
echo $faker->address(); // fake address
echo $faker->phoneNumber(); // fake phone
← PHP 11 | Next: PHP 13 → Exceptions & Error Handling →