Master PHP Development: 10 Time-Saving Code Snippets You Need
As PHP developers, we often find ourselves solving similar problems across different projects. Whether you’re building enterprise applications, handling API integrations, or managing data processing tasks, having a reliable set of code snippets can significantly boost your productivity. In this article, we’ll explore 10 practical PHP code snippets that you’ll actually use in your day-to-day development work.
1. Secure Database Connection with PDO
Stop wrestling with database connections. Here’s a production-ready PDO connection class that includes error handling and connection pooling:
phpCopyclass DatabaseConnection {
private static $instance = null;
private $conn;
private function __construct() {
try {
$config = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
$this->conn = new PDO(
"mysql:host=" . $_ENV['DB_HOST'] . ";dbname=" . $_ENV['DB_NAME'],
$_ENV['DB_USER'],
$_ENV['DB_PASS'],
$config
);
} catch (PDOException $e) {
error_log("Connection failed: " . $e->getMessage());
throw new Exception("Database connection failed");
}
}
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance->conn;
}
}
// Usage
$db = DatabaseConnection::getInstance();
2. API Response Handler
Handle API responses consistently across your application with this robust response handler:
phpCopyclass APIResponse {
public static function send($data = null, $message = '', $status = 200) {
header('Content-Type: application/json');
http_response_code($status);
$response = [
'success' => $status >= 200 && $status < 300,
'message' => $message,
'data' => $data,
'timestamp' => date('c'),
'requestId' => uniqid()
];
echo json_encode($response);
exit;
}
public static function error($message, $status = 400, $errors = []) {
self::send(['errors' => $errors], $message, $status);
}
}
// Usage
APIResponse::send($userData, 'User data retrieved successfully');
APIResponse::error('Invalid input', 400, ['email' => 'Invalid email format']);
3. File Upload Handler with Security Checks
Secure file uploads are crucial in enterprise applications. Here’s a battle-tested file upload handler:
phpCopyclass FileUploader {
private $allowedTypes = ['image/jpeg', 'image/png', 'application/pdf'];
private $maxSize = 5242880; // 5MB
public function upload($file, $destination) {
try {
if (!isset($file['error']) || is_array($file['error'])) {
throw new RuntimeException('Invalid parameters.');
}
if ($file['size'] > $this->maxSize) {
throw new RuntimeException('File too large.');
}
if (!in_array($file['type'], $this->allowedTypes)) {
throw new RuntimeException('Invalid file format.');
}
$fileName = sprintf('%s-%s.%s',
uniqid(),
hash('sha256', $file['name']),
pathinfo($file['name'], PATHINFO_EXTENSION)
);
if (!move_uploaded_file($file['tmp_name'], $destination . $fileName)) {
throw new RuntimeException('Failed to move uploaded file.');
}
return $fileName;
} catch (RuntimeException $e) {
error_log($e->getMessage());
return false;
}
}
}
// Usage
$uploader = new FileUploader();
$fileName = $uploader->upload($_FILES['document'], '/path/to/uploads/');
4. Cache Manager with Redis
Implement efficient caching in your enterprise applications:
phpCopyclass CacheManager {
private $redis;
private $defaultTTL = 3600; // 1 hour
public function __construct() {
$this->redis = new Redis();
$this->redis->connect($_ENV['REDIS_HOST'], $_ENV['REDIS_PORT']);
}
public function get($key) {
$value = $this->redis->get($key);
return $value ? json_decode($value, true) : null;
}
public function set($key, $value, $ttl = null) {
$ttl = $ttl ?? $this->defaultTTL;
return $this->redis->setex(
$key,
$ttl,
json_encode($value)
);
}
public function delete($key) {
return $this->redis->del($key);
}
}
// Usage
$cache = new CacheManager();
$cache->set('user:123', $userData, 1800);
$userData = $cache->get('user:123');
5. Date Range Validator
Validate and manage date ranges effectively:
phpCopyclass DateRangeValidator {
public static function validate($startDate, $endDate, $format = 'Y-m-d') {
$start = DateTime::createFromFormat($format, $startDate);
$end = DateTime::createFromFormat($format, $endDate);
if (!$start || !$end) {
return false;
}
$start->setTime(0, 0, 0);
$end->setTime(23, 59, 59);
return [
'valid' => $start <= $end,
'start' => $start,
'end' => $end,
'days' => $start->diff($end)->days + 1
];
}
public static function getDatesBetween($startDate, $endDate) {
$dates = [];
$period = new DatePeriod(
new DateTime($startDate),
new DateInterval('P1D'),
(new DateTime($endDate))->modify('+1 day')
);
foreach ($period as $date) {
$dates[] = $date->format('Y-m-d');
}
return $dates;
}
}
// Usage
$validation = DateRangeValidator::validate('2025-01-01', '2025-01-31');
$dateRange = DateRangeValidator::getDatesBetween('2025-01-01', '2025-01-31');
6. Excel Export Handler
Generate Excel files for reporting purposes:
phpCopyclass ExcelExporter {
public static function export($data, $filename) {
$spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// Add headers
$columns = array_keys(reset($data));
foreach ($columns as $key => $column) {
$sheet->setCellValueByColumnAndRow($key + 1, 1, ucfirst($column));
}
// Add data
$row = 2;
foreach ($data as $item) {
$col = 1;
foreach ($item as $value) {
$sheet->setCellValueByColumnAndRow($col, $row, $value);
$col++;
}
$row++;
}
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="' . $filename . '"');
header('Cache-Control: max-age=0');
$writer->save('php://output');
exit;
}
}
// Usage
ExcelExporter::export($reportData, 'monthly-report.xlsx');
7. Email Template Manager
Manage email templates efficiently:
phpCopyclass EmailTemplateManager {
private $templates = [];
private $mailer;
public function __construct() {
$this->mailer = new PHPMailer(true);
$this->mailer->isHTML(true);
// Configure your SMTP settings here
}
public function loadTemplate($name, $variables = []) {
$template = file_get_contents("templates/{$name}.html");
foreach ($variables as $key => $value) {
$template = str_replace("{{" . $key . "}}", $value, $template);
}
return $template;
}
public function send($to, $subject, $templateName, $variables = []) {
try {
$this->mailer->addAddress($to);
$this->mailer->Subject = $subject;
$this->mailer->Body = $this->loadTemplate($templateName, $variables);
return $this->mailer->send();
} catch (Exception $e) {
error_log("Email sending failed: " . $e->getMessage());
return false;
}
}
}
// Usage
$emailManager = new EmailTemplateManager();
$emailManager->send(
'[email protected]',
'Welcome!',
'welcome-email',
['name' => 'John', 'activation_link' => $link]
);
8. Request Rate Limiter
Protect your APIs with rate limiting:
phpCopyclass RateLimiter {
private $redis;
private $maxRequests = 100;
private $timeWindow = 3600; // 1 hour
public function __construct() {
$this->redis = new Redis();
$this->redis->connect($_ENV['REDIS_HOST'], $_ENV['REDIS_PORT']);
}
public function checkLimit($identifier) {
$key = "rate_limit:{$identifier}";
$current = $this->redis->get($key);
if (!$current) {
$this->redis->setex($key, $this->timeWindow, 1);
return true;
}
if ($current >= $this->maxRequests) {
return false;
}
$this->redis->incr($key);
return true;
}
}
// Usage
$limiter = new RateLimiter();
if (!$limiter->checkLimit($_SERVER['REMOTE_ADDR'])) {
APIResponse::error('Rate limit exceeded', 429);
}
9. URL Slug Generator
Generate SEO-friendly URLs:
phpCopyclass SlugGenerator {
public static function generate($string, $separator = '-') {
$string = preg_replace('/[^\p{L}\p{N}]+/u', $separator, $string);
$string = mb_strtolower($string);
$string = trim($string, $separator);
return $string;
}
public static function uniqueSlug($string, $callback) {
$originalSlug = self::generate($string);
$slug = $originalSlug;
$counter = 1;
while ($callback($slug)) {
$slug = $originalSlug . $separator . $counter;
$counter++;
}
return $slug;
}
}
// Usage
$slug = SlugGenerator::generate('My Blog Post Title!'); // my-blog-post-title
$uniqueSlug = SlugGenerator::uniqueSlug('My Blog Post', function($slug) {
// Check if slug exists in database
return Database::slugExists($slug);
});
10. Array to CSV Converter
Convert arrays to CSV files with proper encoding:
phpCopyclass CSVConverter {
public static function arrayToCSV($array, $filename, $delimiter = ',') {
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="' . $filename . '"');
$output = fopen('php://output', 'w');
fprintf($output, chr(0xEF).chr(0xBB).chr(0xBF)); // UTF-8 BOM
// Write headers
if (!empty($array)) {
fputcsv($output, array_keys(reset($array)), $delimiter);
}
// Write data
foreach ($array as $row) {
fputcsv($output, $row, $delimiter);
}
fclose($output);
exit;
}
}
// Usage
CSVConverter::arrayToCSV($data, 'export.csv');
Conclusion
These code snippets represent solutions to common challenges in enterprise PHP development. They’re designed to be both secure and scalable, following modern PHP best practices. Remember to adapt these snippets to your specific needs and always consider your application’s security requirements.
By incorporating these snippets into your development workflow, you can save time and maintain consistency across your projects. Feel free to modify and enhance them based on your specific use cases.