Hàm trả về kiểu trong PHP

Ghi chú. Bài đăng này đã hơn hai năm tuổi và vì vậy thông tin ở đây có thể đã lỗi thời. Nếu bạn phát hiện ra điều gì đó, vui lòng để lại nhận xét và chúng tôi sẽ cố gắng khắc phục

Ngày 23 tháng 7 năm 2018 - Thời gian đọc 10 phút

Tôi đã sử dụng PHP được nhiều năm và đã thấy những điều tương tự được thực hiện với các giá trị trả về từ các hàm lặp đi lặp lại. Tôi đã luôn nghĩ về điều này khá chuẩn mực, nhưng tôi càng nghĩ về nó thì nó càng không hợp lý. Nhìn lại sự nghiệp của mình, tôi khá chắc chắn rằng có thể tránh được một số lỗi nghiêm trọng nếu tôi không kết hợp các loại trả lại

Vì PHP là một ngôn ngữ được gõ lỏng lẻo, điều này mang lại cho các nhà phát triển khả năng thay đổi loại giá trị được trả về từ một hàm. Điều này xảy ra khá thường xuyên trong chính cơ sở mã PHP vì nhiều hàm dựng sẵn sẽ trả về false nếu xảy ra lỗi

Một thực tế phổ biến trong mã vùng đất của người dùng là trả về false từ một hàm nếu có lỗi xảy ra. Điều này có thể là do nó được khuyến khích trong chính PHP

Một ví dụ ở đây sẽ tải mọi thứ ra khỏi cơ sở dữ liệu. Điều xảy ra là nếu không thể truy cập cơ sở dữ liệu hoặc có lỗi thuộc loại nào đó, thì hàm sẽ trả về false. Nếu mọi thứ hoạt động thì dữ liệu được trả về. Mã dưới đây đại diện cho điều này

function loadFromDatabase($db)
{
  $result = mysqli_query($db, 'SELECT * FROM thing;');

  if ($result) {
    return false;
  }

  $data = [];

  while ($row = $result->fetch_assoc())
  {
    $data[] = $row;
  }

  return $data;
}

Theo mệnh giá, thật hợp lý khi trả về false nếu có điều gì đó không ổn. Tuy nhiên, những gì chúng tôi đang làm ở đây là chuyển các vấn đề và sự phức tạp lên luồng. Để sử dụng chức năng này, chúng ta cần lưu ý rằng các loại dữ liệu khác nhau có thể được trả về. Vì vậy, chúng tôi cần phát hiện xem liệu sai có được trả về hay không hoặc nếu một tập kết quả trống được trả về trước khi chúng tôi bắt đầu xử lý dữ liệu

$db = mysqli_connect($host, $user, $pass, $database);
$result = loadFromDatabase($db);

if ($result === false) {
  // Error encountered.
}

if (count($result) == 0) {
  // No results found.
}

// Process data.

Điều này có vẻ đơn giản, nhưng tôi không thể nói cho bạn biết đã bao nhiêu lần tôi gặp lỗi trong mã do không phát hiện đúng kiểu trả về. Đây có thể là những thứ đơn giản như cố gắng lặp lại một giá trị sai nhưng có thể tự biểu hiện theo những cách tinh vi hơn

Ví dụ: giả sử rằng chúng tôi muốn xử lý một ngày và nếu ngày đó không hợp lệ thì chúng tôi trả về false. Vấn đề là nếu chúng ta không bắt gặp một ngày không hợp lệ thì chúng ta sẽ không biết liệu chức năng này có lỗi do ngày không hợp lệ hay do strtotime() tạo ra phản hồi sai

Ngoài ra, nếu chúng tôi không phát hiện chính xác phản hồi sai thì chúng tôi có thể dễ dàng tạo một ngày có số 0 (i. e. 'false' chuyển thành giá trị số nguyên) cho dấu thời gian. Tôi chắc rằng bạn đã thấy ngày 1 tháng 1 năm 1970 nhiều lần trên internet và nó thường được tạo ra từ các vấn đề như thế này

Tình huống này giống với mã truy vấn cơ sở dữ liệu ở trên. Với sai trong tay, chúng tôi chỉ có thể đoán rằng có điều gì đó tồi tệ đã xảy ra trong lớp cơ sở dữ liệu chứ không thể đoán chính xác điều gì đã xảy ra

Vấn đề này có thể được giải quyết theo một số cách

Ném ngoại lệ

Thay vì trả về false, cách tiếp cận tốt hơn nhiều là ném một ngoại lệ. Bằng cách này, thay vì không chắc chắn về lý do tại sao hàm trả về false, bạn có thể xử lý kết quả theo cách tinh tế hơn (và có thể dự đoán được)

Sử dụng lại hàm loadFromDatabase(), chúng ta có thể điều chỉnh điều đó bằng cách xác định một lớp ngoại lệ và sau đó ném ngoại lệ đó khi xảy ra lỗi

class DatabaseErrorException extends Exception {}

function loadFromDatabase($db)
{
  $result = mysqli_query($db, 'SELECT * FROM thing;');

  if ($result === false) {
    throw new DatabaseErrorException();
  }

  $data = [];

  while ($row = $result->fetch_assoc())
  {
    $data[] = $row;
  }

  return $data;
}

Đoạn mã sử dụng mã này sau đó có thể được viết lại.

$db = mysqli_connect($host, $user, $pass, $database);

try {
  $result = loadFromDatabase($db);
  // Process the data.
} catch (DatabaseErrorException $e) {
  // Error encountered.
}

Thay đổi duy nhất này có nghĩa là nếu cơ sở dữ liệu gặp lỗi thì chúng tôi có thể hoàn toàn chắc chắn rằng điều này đã xảy ra. Không chỉ vậy mà chúng ta còn có thể ngăn không cho mã cố gắng xử lý dữ liệu khi dữ liệu không tồn tại ngay từ đầu. Khi ngoại lệ được ném vào hàm loadFromDatabase(), không có phần mã nào còn lại trong khối thử được chạy, vì vậy chúng tôi có thể chắc chắn rằng chúng tôi sẽ không ở trạng thái xử lý một nửa. Rõ ràng là một ngoại lệ sẽ không cho chúng tôi biết điều gì đã xảy ra với bất kỳ chi tiết nào, nhưng đây chỉ là một ví dụ đơn giản

Ném ngoại lệ là một ý tưởng hay, nhưng giống như nhiều thứ khác, nó có thể bị lạm dụng. Bạn có thể dễ dàng rơi vào tình huống ứng dụng của bạn gặp sự cố vì bạn đã ném một ngoại lệ và không nắm bắt chính xác. Vì lý do đó, bạn phải luôn đảm bảo rằng mã của mình bắt được bất kỳ và tất cả các ngoại lệ có thể bị ném. Nó cung cấp thông tin phản hồi tuyệt vời về những gì ứng dụng của bạn đang làm và có thể được sử dụng để thoát ra khỏi một chức năng mà không cần sử dụng các loại ngẫu nhiên trong báo cáo của bạn

Đặt loại trả lại

Ngoài việc đưa ra các ngoại lệ, chúng ta cũng có thể đặt kiểu trả về. PHP 7 đã thêm một tính năng ngôn ngữ cho phép các nhà phát triển quy định loại giá trị nào được trả về từ một hàm. Sử dụng tính năng này có nghĩa là chúng ta có thể bắt buộc một hàm trả về một số nguyên bằng cách thực thi điều này ở cấp độ ngôn ngữ

Các loại sau đây được hỗ trợ

  • int
  • trôi nổi
  • bool
  • chuỗi
  • giao diện
  • mảng
  • gọi được
  • đối tượng (kể từ PHP 7. 2)

Để triển khai tính năng này, bạn cần thêm hai điều vào mã của mình

Ngay ở đầu tệp PHP, bạn cần bao gồm một khai báo yêu cầu PHP diễn giải tệp bằng cách sử dụng các kiểu trả về bắt buộc. Không có điều này, mã sẽ không đưa ra lỗi cú pháp, nhưng nó sẽ không thực thi các kiểu trả về. Tính năng này cho phép bạn bật và tắt tính năng phát hiện kiểu trả về bằng một thay đổi đơn giản

declare(strict_types=1);

Điều quan trọng cần lưu ý là khai báo này chỉ ảnh hưởng đến mã trong tệp được khai báo trong. Điều này là để ngăn các thư viện bên ngoài vô tình bị ảnh hưởng bởi sự thay đổi này

Với vị trí đó, giờ đây bạn có thể xác định các hàm theo cách sau

function returnOne(): int {
  return 1;
}

Định nghĩa hàm này nói rằng hàm này phải trả về một số nguyên. Nếu không thì chúng ta sẽ gặp lỗi như thế này

PHP Fatal error:  Uncaught TypeError: Return value of returnOne() must be of the type integer, string returned.

Lỗi mà PHP đưa ra ở đây có thể được coi là ngoại lệ TypeError. Điều này cho phép chúng tôi có khả năng thích ứng với các chức năng trả về sai loại

function returnWrongType(): int {
  return false;
}

try {
  returnWrongType();
} catch (TypeError $e) {
  echo 'Wrong type found.';
}

Kể từ PHP 7. 1 bạn có thể chỉ định loại trả về nullable với dấu chấm hỏi ở phía trước loại trả về. Điều này có nghĩa là bạn có thể trả về một số nguyên hoặc một giá trị null. Lưu ý rằng không trả lại bất cứ thứ gì về mặt kỹ thuật cũng có nghĩa là trả về giá trị null

________số 8_______

Với các loại trả về và ngoại lệ, sau đó chúng ta có thể tạo các hàm với các triển khai rất dễ đoán, dễ giao tiếp hơn. Không chỉ vậy, việc kiểm tra các chức năng có thể dự đoán trở nên dễ dàng hơn rất nhiều

PHP

tiêu chuẩn mã hóa

thực hành tốt nhất

Hàm trả về kiểu trong PHP

Được viết bởi. Philip Norton

Phil là người sáng lập và quản trị viên của #. viết mã và là một chuyên gia CNTT làm việc ở Tây Bắc Vương quốc Anh. Tốt nghiệp năm 2003 tại Đại học Aberystwyth với bằng Thạc sĩ Khoa học Máy tính Phil trước đây đã từng làm quản trị viên cơ sở dữ liệu, trên bàn trợ giúp CNTT, huấn luyện viên hệ thống, kiến ​​trúc web, tư vấn khả năng sử dụng, blogger và chuyên gia SEO. Phil có nhiều kinh nghiệm xây dựng và duy trì các trang web PHP cũng như làm việc với các công nghệ liên quan như JavaScript, HTML, CSS, XML, Flex, Apache, MySQL và Linux

Làm cách nào để đặt kiểu trả về của hàm trong PHP?

Khai báo kiểu trả về PHP . Để khai báo kiểu trả về của hàm, hãy thêm dấu hai chấm (. ) và nhập ngay trước dấu ngoặc nhọn ( { ) khi khai báo hàm .

Kiểu trả về của hàm là gì?

Kết quả của một hàm được gọi là giá trị trả về của nó và kiểu dữ liệu của giá trị trả về được gọi là kiểu trả về. Mỗi khai báo và định nghĩa hàm phải chỉ định một kiểu trả về, cho dù nó có thực sự trả về một giá trị hay không.

Làm cách nào để trả về kiểu dữ liệu trong PHP?

Hàm gettype() trả về loại biến.

Bạn có thể trả về một hàm trong PHP không?

Hàm PHP trả về giá trị . return dừng việc thực thi hàm và gửi giá trị trở lại mã gọi. Bạn có thể trả về nhiều hơn một giá trị từ một hàm bằng cách sử dụng mảng trả về(1,2,3,4). A function can return a value using the return statement in conjunction with a value or object. return stops the execution of the function and sends the value back to the calling code. You can return more than one value from a function using return array(1,2,3,4).