Bộ câu hỏi phỏng vấn PHP phần 3

Sự khác biệt chính giữa const và define là gì?


Sự khác biệt cơ bản giữa const so với defineconst xác định các hằng số tại compile time (thời điểm biên dịch), trong khi define xác định chúng tại runtime.

const FOO = 'BAR';
define('FOO', 'BAR');

// but
if (...) {
   const FOO = 'BAR'; // Invalid
}
if (...) {
   define('FOO', 'BAR'); // Valid
}

Cũng cho đến PHP 5.3, const không thể được sử dụng trong phạm vi toàn cục (global scope). Bạn chỉ có thể sử dụng const trong một lớp. const được sử dụng khi bạn muốn đặt một số loại tùy chọn hoặc cài đặt không đổi liên quan đến lớp đó. Hoặc có thể bạn muốn tạo một số loại enum. Một ví dụ về cách sử dụng const tốt là loại bỏ các magic number.

Define có thể được sử dụng cho cùng một mục đích, nhưng nó chỉ có thể được sử dụng trong phạm vi toàn cục. Nó chỉ nên được sử dụng cho các cài đặt chung ảnh hưởng đến toàn bộ ứng dụng. Trừ khi bạn cần bất kỳ loại định nghĩa có điều kiện hoặc cụ thể nào, hãy sử dụng const thay vì define() - đơn giản là để dễ đọc!

Sự khác biệt giữa isset() và array_key_exists() là gì?


  • array_key_exists sẽ cho bạn biết nếu một key tồn tại trong một mảng và thông báo khi $a không tồn tại.
  • isset sẽ chỉ trả về true nếu key/variable tồn tại và không null. isset không thông báo khi $a không tồn tại.
$a = array('key1' => 'Foo Bar', 'key2' => null);

isset($a['key1']); // true
array_key_exists('key1', $a); // true

isset($a['key2']); // false
array_key_exists('key2', $a); // true

Sự khác biệt giữa var_dump() và print_r() là gì?


Hàm var_dump hiển thị thông tin cấu trúc về các biến/biểu thức bao gồm kiểu và giá trị của nó. Mảng được khám phá (explore) theo cách đệ quy với các giá trị được thụt vào để hiển thị cấu trúc. Nó cũng cho biết giá trị mảng và thuộc tính đối tượng nào là tham chiếu. print_r() hiển thị thông tin về một biến theo cách mà con người có thể đọc được, các giá trị mảng sẽ được trình bày ở định dạng hiển thị các key và element.

$obj = (object) array('qualitypoint', 'technologies', 'India');

var_dump($obj) sẽ hiển thị đầu ra bên dưới trong màn hình:

object(stdClass)#1 (3) {
   [0]=> string(12) "qualitypoint"
   [1]=> string(12) "technologies"
   [2]=> string(5) "India"
}

Và, print_r($obj) sẽ hiển thị bên dưới kết quả đầu ra trong màn hình.

stdClass Object (
   [0] => qualitypoint
   [1] => technologies
   [2] => India
)

Làm thế nào bạn có thể kích hoạt báo cáo lỗi trong PHP?


  • Kiểm tra xem display_errors có bằng on trong php.ini hay không hoặc khai báo ini_set('display_errors', 1) trong tập lệnh của bạn.
  • Sau đó, bao gồm error_reporting(E_ALL) trong mã của bạn để hiển thị tất cả các loại thông báo lỗi trong quá trình thực thi tập lệnh.

Bạn có thể kế thừa một lớp được định nghĩa là Final không?


Không, bạn không thể kế thừa một lớp được định nghĩa là Final.

Một phương thức hoặc lớp được khai báo là Final ngăn chặn việc ghi đè lớp con hoặc phương thức.

Kể một số ví dụ thực tế khi bạn cần phải sử dụng \_\_destruct trong các lớp của mình?


Chúng ta biết rằng \_\_destruct được gọi khi đối tượng bị hủy. Về mặt logic, điều gì sẽ xảy ra nếu đối tượng bị hủy? Vâng, nó có nghĩa là nó không còn nữa. Vì vậy, nếu nó có các tài nguyên đang mở, bạn nên đóng các tài nguyên đó vì nó sẽ bị hủy hoặc tự dọn dẹp. Ngoài ra, bởi vì PHP sẽ đóng tài nguyên khi chấm dứt giùm bạn không có nghĩa là việc đóng chúng một cách rõ ràng khi bạn không cần nữa là điều tồi tệ.

Một số ví dụ thực tế là:

  • Đóng database connector/wrapper connection
  • Xóa các thư mục tạm thời
  • Dọn dẹp bộ nhớ đệm
  • Ghi các tin nhắn log trong hàng đợi vào database/file

Làm cách nào để có thể đặt thời gian thực thi vô hạn cho tập lệnh PHP?


set_time_limit(0) được thêm vào đầu tập lệnh để đặt thời gian vô hạn cho thực thi để không xảy ra lỗi "maximum execution time exceeded" trong PHP. Chúng ta cũng có thể thực hiện việc này trong tệp php.ini.

Kể tên các phạm vi của biến trong PHP?


Phạm vi của biến (variable scope) được biết đến là ranh giới của biến, trong đó nó có thể được nhìn thấy hoặc được truy cập từ mã. Nói cách khác, nó là ngữ cảnh mà trong đó một biến được xác định. Chỉ có hai phạm vi có sẵn trong PHP là phạm vi cục bộ (local scope) và phạm vi toàn cục (global scope).

  • Local variables (phạm vi cục bộ)
  • Global variables (phạm vi toàn cục)
  • Static variables (phạm vi cục bộ)
  • Function parameters (phạm vi cục bộ)

Khi một biến được truy cập bên ngoài phạm vi của nó, nó sẽ gây ra lỗi undefined variable.

Có hàm nào để tạo một bản sao của một mảng sang một mảng khác trong PHP không?


Trong PHP, các mảng được gán bằng bản sao, trong khi các đối tượng được gán bằng tham chiếu nên PHP sẽ sao chép mảng theo mặc định. Các tham chiếu trong PHP phải rõ ràng:

$a = array(1,2);
$b = $a; // $b will be a different array
$c = &$a; // $c will be a reference to $a

Giải thích sự khác biệt giữa shell_exec() và exec()?


  • shell_exec trả về tất cả đầu ra dưới dạng một chuỗi.
  • exec mặc định trả về dòng cuối cùng của đầu ra, nhưng có thể cung cấp tất cả đầu ra dưới dạng một mảng dựa theo tham số thứ hai.

Sự khác biệt giữa array_map, array_walk và array_filter là gì?


  • array_walk nhận một mảng và một hàm F và sửa đổi nó bằng cách thay thế mọi phần tử x bằng F(x).
  • array_map thực hiện điều tương tự, ngoại trừ việc thay vì sửa đổi tại chỗ, nó sẽ trả về một mảng mới với các phần tử đã biến đổi.
  • array_filter với hàm F, thay vì biến đổi các phần tử, sẽ loại bỏ bất kỳ phần tử nào mà F(x) bằng false.

Giải thích sự khác biệt giữa exec(), system() và passthru()?


  • exec() là để gọi một lệnh của hệ thống và có thể tự xử lý đầu ra.
  • system() là để thực hiện một lệnh của hệ thống và ngay lập tức hiển thị đầu ra - có thể là văn bản (text).
  • passthru() là để thực hiện một lệnh của hệ thống và trả về cho bạn một bản thô (raw) - có lẽ là một nhị phân gì đó.

Sự khác biệt giữa query() của PDO và execute() là gì?


  • query chạy một câu lệnh SQL chuẩn và yêu cầu bạn thoát đúng cách tất cả dữ liệu để tránh SQL Injjection và các sự cố khác.
  • execute chạy một câu lệnh được chuẩn bị sẵn cho phép bạn ràng buộc các tham số để tránh phải thoát hoặc trích dẫn các tham số. execute cũng sẽ hoạt động tốt hơn nếu bạn đang lặp lại một truy vấn nhiều lần.

Cách sử dụng tốt nhất là sử dụng execute cho các câu lệnh đã chuẩn bị sẵn để tăng cường bảo mật. Ngoài tính năng thoát (escape) ở phía client mà nó cung cấp, một câu lệnh đã chuẩn bị được biên dịch ở phía server một lần và sau đó có thể được truyền các tham số khác nhau ở mỗi lần thực thi.

Các hàm tạo của lớp cha có được gọi ngầm bên trong một hàm tạo của lớp con không?


Không, một hàm tạo cha phải được gọi một cách rõ ràng như sau:

parent::constructor($value)
Avatar Techmely Team
VIẾT BỞI

Techmely Team