Luyện Phỏng Vấn IT — 2000+ Câu Hỏi Phỏng Vấn IT Có Đáp Án 2026

PHP viết tắt của Hypertext Preprocessor, là ngôn ngữ lập trình phía server dùng để tạo trang web động.

  • Khi người dùng truy cập một trang PHP, server sẽ thực thi mã PHP rồi trả về HTML cho trình duyệt.
  • Khác với JavaScript chạy trên trình duyệt, PHP chạy hoàn toàn trên server trước khi gửi kết quả về cho client.
  • PHP là mã nguồn mở, đa nền tảng và tích hợp tốt với các cơ sở dữ liệu như MySQL, PostgreSQL.

Superglobal là các biến được PHP định nghĩa sẵn, có thể truy cập ở bất kỳ đâu trong script mà không cần khai báo global.

  • Các superglobal quan trọng: $_GET (dữ liệu gửi qua URL), $_POST (dữ liệu gửi ẩn qua form), $_SERVER (thông tin server), $_FILES (file được upload), $_COOKIE (dữ liệu cookie), $_SESSION (lưu trữ session), $GLOBALS (chứa tất cả biến toàn cục).
  • PHP tự động gán giá trị cho các biến này và có thể dùng trong mọi hàm hay phạm vi.

Cả hai đều thu thập dữ liệu từ form nhưng khác nhau về tính bảo mật và giới hạn dữ liệu. $_GET đính kèm dữ liệu vào URL (dễ nhìn thấy), giới hạn khoảng 2KB và không an toàn cho dữ liệu nhạy cảm. $_POST gửi dữ liệu trong body của request (ẩn với URL), có giới hạn dung lượng lớn hơn nhiều (do post_max_size trong php.ini, mặc định ~8MB) và an toàn hơn cho mật khẩu hay thông tin cá nhân.

Dùng $_GET khi lọc/tìm kiếm và muốn bookmark URL, dùng $_POST cho các form nhập dữ liệu nhạy cảm.

PHP có 8 kiểu dữ liệu cơ bản: String (chuỗi như "Hello"), Integer (số nguyên), Float (số thập phân), Boolean (true/false), Array (tập hợp giá trị), Object (thực thể của lớp), NULL (không có giá trị), và Resource (tham chiếu tài nguyên bên ngoài).

  • Bốn kiểu đầu là scalar (kiểu đơn giản), Array và Object là kiểu phức hợp, NULL là kiểu đặc biệt, còn Resource dùng cho kết nối database hay file handle.
  • PHP 8.1+ bổ sung Enum như là first-class type với type safety đầy đủ, cùng với union types (8.0: int|string), intersection types (8.1: A&B), và never type (8.1).

== kiểm tra giá trị có bằng nhau không nhưng cho phép chuyển đổi kiểu dữ liệu.

Ví dụ "5" == 5 trả về true vì PHP tự đổi chuỗi thành số.

  • PHP có ba loại mảng: Indexed array (truy cập theo vị trí: $fruits[0]), Associative array (truy cập theo key: $person["name"]), và Multidimensional array (mảng chứa mảng khác).
  • Tạo mảng indexed: $arr = ["apple", "banana"], mảng associative: $arr = ["name" => "John", "age" => 30].
  • Các hàm thông dụng: count() đếm phần tử, array_push() thêm phần tử, array_merge() gộp mảng, in_array() kiểm tra tồn tại, array_keys()array_values() lấy key hoặc value.

Các hàm chuỗi quan trọng gồm: strlen() (lấy độ dài), strpos() (tìm vị trí chuỗi con), str_replace() (thay thế text), substr() (cắt chuỗi), strtolower()strtoupper() (đổi chữ hoa/thường), trim() (xóa khoảng trắng đầu cuối), explode() (tách chuỗi thành mảng), implode() (ghép mảng thành chuỗi), htmlspecialchars() (escape HTML để bảo mật).

Ví dụ: explode(",", "apple,banana,orange") tạo ra ["apple", "banana", "orange"].

Cả hai đều nhúng file PHP bên ngoài, nhưng khác nhau ở cách xử lý lỗi. include chỉ cảnh báo (E_WARNING) nếu file không tồn tại và tiếp tục chạy, còn require báo lỗi nghiêm trọng (E_ERROR) và dừng thực thi ngay. include_oncerequire_once chỉ nhúng file một lần duy nhất trong cùng script.

Dùng require cho các file thiết yếu (như kết nối database) và include cho các thành phần không bắt buộc (như sidebar template).

Truy cập dữ liệu form qua superglobal: method GET dùng $_GET["fieldname"], POST dùng $_POST["fieldname"]. Luôn validate và sanitize: kiểm tra tồn tại với isset($_POST["email"]), validate định dạng với filter_var(), escape output với htmlspecialchars() để ngăn XSS.

Ví dụ: $email = htmlspecialchars($_POST["email"]); if(filter_var($email, FILTER_VALIDATE_EMAIL)) { // hợp lệ }. Không bao giờ tin tưởng dữ liệu từ người dùng—luôn validate trước khi sử dụng.

PHP có ba loại lỗi truyền thống: Notice (không nghiêm trọng, không dừng script như truy cập biến chưa định nghĩa), Warning (nghiêm trọng hơn nhưng script vẫn chạy như mở file không hợp lệ), và Fatal error (nghiêm trọng, dừng thực thi như gọi hàm chưa định nghĩa).

  • PHP 7+ bổ sung hệ thống Error class: ErrorException đều implement Throwable, bao gồm TypeError, ValueError, ParseError.
  • Xử lý lỗi bằng: error_reporting(E_ALL) hiển thị mọi lỗi, set_error_handler() xử lý tùy chỉnh, hoặc dùng try-catch cho Throwable.
  • Trên môi trường production, ghi lỗi vào file log thay vì hiển thị cho người dùng.

Định nghĩa hằng số bằng define("CONSTANT_NAME", value) hoặc const CONSTANT_NAME = value;.

  • Hằng số không có dấu $, không thể thay đổi sau khi định nghĩa, là global mà không cần dùng từ khóa global.
  • Từ PHP 8.0, hằng số luôn case-sensitive (tham số $case_insensitive của define() đã bị xóa).
  • Dùng hằng cho giá trị cấu hình: define("DB_HOST", "localhost"); echo DB_HOST;.
  • Nên dùng hằng thay biến cho các giá trị không bao giờ thay đổi trong quá trình thực thi.

Class là bản thiết kế (blueprint) định nghĩa thuộc tính và phương thức, còn Object là một thực thể cụ thể được tạo ra từ class đó.

  • Hãy nghĩ class như khuôn bánh và object như những chiếc bánh thực sự.
  • Khai báo class: class User { public $name; public function getName() { return $this->name; } }.
  • Tạo object: $user = new User();.
  • Mỗi object có bản sao thuộc tính riêng nhưng chia sẻ chung phần code của phương thức.

Kế thừa cho phép class con kế thừa thuộc tính và phương thức từ class cha, giúp tái sử dụng code. Dùng class Student extends User để kế thừa. Class con có thể truy cập các thành phần public và protected của cha, override phương thức cha, và thêm chức năng mới. Gọi phương thức cha bằng parent::methodName().

Ví dụ: class Admin extends User nghĩa là Admin có tất cả thuộc tính của User nhưng bổ sung thêm các phương thức đặc thù của admin. Giúp giảm trùng lặp code và tạo ra cấu trúc phân cấp hợp lý.

PHP không hỗ trợ đa kế thừa (một class chỉ có thể extends một class cha). Thay vào đó, dùng interface: một class có thể implement nhiều interface.

Ví dụ: class Employee implements Payable, Manageable trong đó cả hai interface đều định nghĩa contract mà class phải thực hiện. Ngoài ra còn có trait để tái sử dụng code: trait Logger { public function log() {} } rồi class User { use Logger; } để chia sẻ phương thức giữa các class không liên quan mà không cần kế thừa.

Interface định nghĩa một hợp đồng (contract)—tập hợp các phương thức mà class implement bắt buộc phải có. Khai báo: interface UserRepository { public function find($id); public function save($user); }. Bất kỳ class nào implement interface này đều phải triển khai tất cả phương thức đó.

Lợi ích: đảm bảo tính nhất quán giữa các implementations, cho phép polymorphism, dễ viết test với mock. Dùng interface khi cần đảm bảo các phương thức nhất định tồn tại bất kể cách implement cụ thể là gì.

Trait cho phép tái sử dụng phương thức trong nhiều class không liên quan mà không cần kế thừa.

  • Khai báo: trait Logger { public function log($msg) { echo $msg; } }.
  • Dùng trong bất kỳ class nào: class User { use Logger; }class Product { use Logger; } thì cả hai đều có phương thức log.
  • Trait giải quyết vấn đề trùng lặp code khi nhiều class cần chức năng giống nhau nhưng không chia sẻ class cha.
  • Chúng giống như tái sử dụng "ngang" trong khi kế thừa là tái sử dụng "dọc".

Magic methods là các phương thức đặc biệt tự động được gọi khi có hành động tương ứng xảy ra. Các magic method quan trọng: __construct() (chạy khi tạo object), __destruct() (chạy khi hủy object), __get() (truy cập thuộc tính không tồn tại), __set() (gán thuộc tính không tồn tại), __call() (gọi phương thức không tồn tại), __toString() (khi object được in như chuỗi).

Ví dụ: truy cập $user->email private sẽ kích hoạt __get("email") để kiểm soát quyền truy cập. Hầu hết magic method phải là public; __construct có thể là protected hoặc private khi dùng cho singleton pattern.

Instance method thuộc về object và truy cập dữ liệu riêng của object qua $this. Gọi bằng $object->method(). Static method thuộc về chính class, không phải instance, và không thể truy cập $this. Khai báo với static function và gọi bằng ClassName::method().

Ví dụ: User::count() (static, đếm tổng user) vs $user->getName() (instance, lấy tên user cụ thể). Static method hữu ích cho utility functions, factory methods, hoặc theo dõi dữ liệu cấp class.

Access modifier kiểm soát khả năng hiển thị của thuộc tính và phương thức: public truy cập được từ mọi nơi (trong/ngoài class và subclass), private chỉ truy cập được bên trong class đó (không phải subclass), protected truy cập được trong class và subclass nhưng không từ bên ngoài.

Ví dụ: private $password ngăn truy cập trực tiếp như $user->password = "hacked", buộc phải dùng setter method để kiểm tra. Dùng private cho dữ liệu nội bộ, protected để subclass dùng, public cho giao diện ra bên ngoài.

Typed class constants cho phép khai báo kiểu dữ liệu cho hằng số trong class, tương tự typed properties.

Ví dụ: public const int MAX_USERS = 1000; hoặc public const string API_KEY = "secret";.

Lợi ích: tăng type safety, IDE autocomplete chính xác hơn, ngăn nhầm kiểu dữ liệu vô tình, tự document code. Kiểu phải khớp với giá trị gán tại thời điểm khai báo—PHP sẽ báo lỗi nếu không khớp. Đây là tính năng nhỏ nhưng quan trọng giúp codebase PHP lớn dễ bảo trì hơn.

Readonly classes ngăn sửa đổi các public property sau khi khởi tạo. Ràng buộc cụ thể: mọi property phải có kiểu (không được khai báo untyped), không thể có static property, không dùng được #[AllowDynamicProperties], và mỗi property phải được gán giá trị trong constructor.

Ví dụ: readonly class Address { public function __construct(public string $street, public string $city) {} }. Rất phù hợp để xây dựng Value Object và DTO bất biến.

Ràng buộc kế thừa: readonly class không thể được extend bởi non-readonly class. Child class bắt buộc phải cũng là readonly — đây là ràng buộc của PHP 8.2.

Enums định nghĩa tập hợp giá trị cố định, hợp lệ với type safety đầy đủ.

Ví dụ: enum OrderStatus { case PENDING; case SHIPPED; case DELIVERED; } rồi $order->status = OrderStatus::PENDING;. Hơn constants ở điểm: type-checked (không thể gán giá trị tùy ý), hỗ trợ method bên trong enum, tích hợp với Eloquent qua cast. Backed enum có value: enum Status: string { case ACTIVE = 'active'; case INACTIVE = 'inactive'; } lưu vào DB dễ dàng. Dùng cho: trạng thái đơn hàng, vai trò người dùng, phương thức thanh toán—bất kỳ tập giá trị có hạn nào cần type safety.