PHP không còn là PHP bạn từng nghe kể
PHP 8 có kiểu dữ liệu, enum, class gọn gàng, gần với TypeScript hơn bạn nghĩ. Bài này đi nhanh qua những gì cần để đọc và viết code Laravel. Ví dụ dùng cú pháp PHP 8.3, mức tối thiểu của Laravel 13.
Cú pháp cơ bản, đặt cạnh JavaScript
$name = 'Trạm'; // biến luôn có dấu $; câu lệnh kết thúc bằng ;
$greeting = 'Xin chào ' . $name; // nối chuỗi bằng dấu chấm, không phải dấu +
$text = "Xin chào {$name}"; // chèn biến chỉ chạy trong chuỗi nháy kép
$user?->profile?->avatar; // ?-> giống ?. trong JS
$city = $input['city'] ?? 'Hà Nội'; // ?? giống JS
1 == '1'; // true (so sánh lỏng)
1 === '1'; // false (so sánh chặt, nên dùng)
Mảng: vừa là array vừa là object
$tags = ['php', 'laravel']; // giống array
$product = ['name' => 'Áo thun', 'price' => 150000]; // giống object / Map
$product['price']; // 150000
count($tags); // 2
Khác biệt quan trọng: mảng PHP được sao chép khi gán (truyền theo giá trị), còn object thì dùng chung như JS. Gán một mảng sang biến khác rồi sửa sẽ không ảnh hưởng mảng gốc.
Trong Laravel, bạn sẽ làm việc nhiều với Collection, lớp bọc mảng có các hàm quen thuộc như map, filter, sum (bài 7).
Hàm, kiểu và closure
function add(int $a, int $b): int
{
return $a + $b;
}
function findName(?int $id): string|null { /* ... */ } // ?int: có thể null; string|null: union type
$double = fn ($x) => $x * 2; // arrow function, tự lấy biến bên ngoài (theo giá trị)
$rate = 0.1;
$tax = function ($price) use ($rate) { // function thường phải khai báo use để lấy biến ngoài
return $price * $rate;
};
add(b: 2, a: 1); // named arguments
$len = strlen(...); // first-class callable, giống truyền tên hàm trong JS
Class, namespace và Composer
namespace App\Services; // giống đường dẫn module
use App\Models\Product; // giống import
final class PriceFormatter
{
// constructor property promotion: khai báo và gán thuộc tính ngay trong constructor
public function __construct(private readonly string $currency = 'đ') {}
public function format(int $amount): string
{
return number_format($amount, 0, ',', '.') . $this->currency; // -> thay cho dấu chấm
}
public static function make(): self // static gọi bằng ::
{
return new self();
}
}
PriceFormatter::make()->format(150000); // "150.000đ"
- Composer là npm của PHP:
composer.jsongiống package.json, thư mụcvendorgiống node_modules,composer require ten/goiđể cài. - Namespace theo thư mục (PSR-4): class
App\Models\Productnằm ở fileapp/Models/Product.php. Composer tự nạp file, bạn chỉ cầnuse. - Trait là "mixin": nhét sẵn một nhóm hàm vào class. Laravel dùng nhiều, ví dụ
use HasFactory, Notifiable;trong model User.
Enum, match và attribute
enum OrderStatus: string
{
case Pending = 'pending';
case Paid = 'paid';
}
$label = match ($status) { // giống switch nhưng trả về giá trị, so sánh chặt
OrderStatus::Pending => 'Chờ thanh toán',
OrderStatus::Paid => 'Đã thanh toán',
};
#[Fillable(['name', 'price'])] // attribute: gắn thông tin lên class, Laravel 13 dùng rất nhiều
class Product extends Model {}
PHP 8.4 và 8.5 còn có property hooks và toán tử pipe, nhưng khóa này giữ code chạy được trên PHP 8.3.
Bài tập
Tạo file thu-php.php ở thư mục bất kỳ:
- Viết enum
OrderStatusvà hàm trả nhãn tiếng Việt bằng match. - Viết class
Productdùng constructor property promotion (tên, giá), có hàm định dạng giá kiểu 150.000đ. - Tạo mảng 3 sản phẩm, in tổng tiền bằng
array_sumvàarray_map. - Chạy bằng lệnh
php thu-php.php.
Xem thêm
- Video chính dài 1 giờ 14 phút, chia chương: kiểu dữ liệu (03:50), mảng (08:53), hàm (15:48), class (31:15), PHP hiện đại (43:35), Composer (56:39). Dev JavaScript có thể xem nhanh phần mảng, class và PHP hiện đại.
- Supercharge Your Laravel App with Enums (kênh Laravel, tiếng Anh, 20 phút)