Chế độ nghiêm ngặt PHP

Vào tháng 12 năm 2015, PHP 7 đã giới thiệu các khai báo kiểu vô hướng và cùng với nó là cờ kiểu nghiêm ngặt. Tính năng mới này là gì?

Điểm hay của việc khai báo tệp PHP là nghiêm ngặt là nó thực sự chỉ áp dụng cho tệp hiện tại. Nó đảm bảo rằng tệp này có các loại nghiêm ngặt, nhưng nó không áp dụng cho bất kỳ tệp nào khác trong toàn bộ dự án. Nó cho phép bạn thực hiện, từng bước, việc di chuyển này từ mã không nghiêm ngặt sang mã nghiêm ngặt, đặc biệt đối với các tệp hoặc dự án mới

Để bật chế độ nghiêm ngặt, một lệnh khai báo phải được đặt ở đầu tệp. Điều này có nghĩa là mức độ nghiêm ngặt của việc gõ cho vô hướng được định cấu hình trên cơ sở từng tệp. Lệnh này không chỉ ảnh hưởng đến khai báo kiểu của tham số mà còn ảnh hưởng đến kiểu trả về của hàm

Các loại nghiêm ngặt ảnh hưởng đến các loại cưỡng chế

Sử dụng loại gợi ý mà không có strict_types có thể dẫn đến các lỗi tinh vi

Không có điều này, int $x có nghĩa là $x must have a value coercible to an int. Bất kỳ giá trị nào có thể bị ép buộc đối với một int sẽ chuyển loại gợi ý, bao gồm

  • một int thích hợp (ví dụ. 42 -> 42)
  • một float (ví dụ. 13. 1459 -> 13)
  • một bool (ví dụ. đúng -> 1)
  • một null (ví dụ. không -> 0)
  • một string với các chữ số đứng đầu (ví dụ. “15 Cây” -> 15)

Bằng cách đặt strict_types=1, bạn nói với công cụ rằng int $x có nghĩa là $x chỉ phải là một kiểu int thích hợp, không cho phép ép buộc kiểu. Bạn có sự đảm bảo tuyệt vời rằng bạn đang nhận được chính xác và chỉ những gì được cung cấp, không có bất kỳ chuyển đổi hoặc tổn thất tiềm năng nào

Ai nên quan tâm đến dòng "loại nghiêm ngặt" này?

Trên thực tế, hãy khai báo (strict_types=1); . Tại sao?

  • Các loại trong phạm vi hiện tại (tệp/lớp) được xử lý nghiêm ngặt

'strict_types=1' dành cho người đọc hơn là người viết

Người viết chỉ cần duy trì sự chặt chẽ như vậy trong khi viết hành vi dự kiến. Điều đó nói rằng, với tư cách là một nhà văn, bạn nên quan tâm đến độc giả của mình, điều này cũng bao gồm cả bản thân bạn trong tương lai. Bởi vì bạn sẽ là một trong số họ

Đôi khi trang web của bạn sẽ báo lỗi PHP sau khi nâng cấp hoặc di chuyển trang web mà trước đây không có. Một trong những lỗi phổ biến hơn mà chúng tôi thấy với Hệ thống quản lý nội dung là lỗi tiêu chuẩn nghiêm ngặt. Nó thường xuất hiện ở đầu trang và trông giống như sau từ trang Joomla

Strict Standards: Non-static method JLoader::import() should not be called statically in  on line 34

Lỗi này đặc biệt có vẻ khó hiểu vì nó không có trong thiết lập trước đó của bạn. Đừng sợ, cái này không có gì ghê gớm và dễ chăm sóc

Lỗi tiêu chuẩn nghiêm ngặt là gì?

Đây không phải là một thông báo 'lỗi' thực sự mà chỉ là một thông báo cung cấp thông tin có ý nghĩa hơn đối với các nhà phát triển. Điều đó không có nghĩa là mã cần phải được thay đổi trong tập lệnh của bạn

Tại sao bạn nhận được thông báo tiêu chuẩn nghiêm ngặt

Cài đặt E_STRICT không được bao gồm trong cài đặt nhóm E_ALL cho đến phiên bản PHP 5. 4, vì vậy nó phải được đặt rõ ràng để báo cáo các tin nhắn. Trong hầu hết các trường hợp, đây không phải là một phần của cài đặt mặc định nên nó không hiển thị. Kể từ ngày 5. 4, tuy nhiên, E_ALL đã bao gồm E_STRICT để nó hiện hiển thị trừ khi bị loại trừ cụ thể. Nếu bạn đến từ một máy chủ có phiên bản PHP thấp hơn 5. 4, đây có thể là lý do tại sao lỗi hiển thị trên trang web của bạn với máy chủ của chúng tôi và không hiển thị trên máy chủ cũ

Cách xóa thông báo 'Tiêu chuẩn nghiêm ngặt'

  1. Đăng nhập vào bảng điều khiển cPanel của bạn
  2. Chế độ nghiêm ngặt PHP

    Tìm mục Files và click vào biểu tượng File Manager

  3. Chế độ nghiêm ngặt PHP

    Khi ở trong Trình quản lý tệp, hãy điều hướng đến tệp php. ini và mở nó để chỉnh sửa. Nếu bạn không có php. ini, vui lòng liên hệ với bộ phận Hỗ trợ trực tiếp để họ có thể đặt một tệp vào tài khoản của bạn cho bạn

  4. Chế độ nghiêm ngặt PHP

    Bên trong php. ini, tìm phần báo cáo lỗi và sau đó tìm cài đặt cụ thể của bạn. Nó sẽ là cái không có dấu chấm phẩy ‘;’ phía trước

    Chế độ nghiêm ngặt có thể được bật để thực thi gợi ý loại cho các loại vô hướng; . php và cũng sẽ áp dụng để bao gồm các tệp

    752 lượt xem

    Chế độ nghiêm ngặt PHP

    Bởi. Jacob

    Đã chỉnh sửa. 2021-02-14 01. 50

    Chế độ nghiêm ngặt có thể được bật để thực thi gợi ý loại cho các loại vô hướng; . Thay vào đó, với chế độ nghiêm ngặt được bật, PHP sẽ đưa ra lỗi và tạm dừng thực thi tập lệnh

    Có thể thêm khai báostrict_types=1 ở đầu thư mục gốc của thành phần của bạn (I. e. chỉ số của bạn. php) để áp dụng lệnh trên quy mô toàn cầu cho dự án của bạn, điều này được thực hiện bằng cách sử dụng cấu trúc khai báo của PHP

    Để bật chế độ nghiêm ngặt cho các loại vô hướng, bạn sẽ cần bao gồm một lệnh khai báo duy nhất ở đầu chỉ mục của mình. php

    php
    declare(strict_types=1);
    
    include 'function.php';
    
    echo say_hallo(200);
    

    Và các chức năng. php

    php
    
    function say_hallo(string $string) {
      return $string;
    }
    

    Ở trên sẽ dẫn đến lỗi loại

    Fatal error: Uncaught TypeError: say_hallo(): Argument #1 ($string) must be of type int, string given, called in /var/www/this.php on line 4 and defined in /var/www/functions.php:3 Stack trace: #0 /var/www/index.php(4): say_hallo() #1 {main} thrown in /var/www/functions.php on line 3
    

    Dường như hiếm khi có bất kỳ vấn đề nào liên quan đến việc truyền các loại vô hướng, vì vậy lợi ích của việc bao gồm khai báo để kích hoạt chế độ nghiêm ngặt cũng nhỏ không kém

    Cách gợi ý kiểu hoạt động trong PHP

    PHP theo truyền thống là một ngôn ngữ được gõ yếu, có nghĩa là bốn loại vô hướng được PHP tự động chuyển đổi (chuyển đổi) khi nó gặp một loại không mong muốn. Trong một thời gian dài, đây thậm chí còn là hành vi ưa thích

    Hãy suy nghĩ về nó. Có thực sự có lợi khi tập lệnh của bạn bị tạm dừng chỉ vì bạn đã sử dụng một chuỗi trong một hàm mong đợi một số nguyên không?

    Vì PHP được nhập yếu, nên một số nguyên được truyền cho một hàm hoặc phương thức mong đợi một chuỗi sẽ chỉ được truyền (chuyển đổi) thành một chuỗi. Trong phần lớn các trường hợp, điều này hoàn toàn ổn và thậm chí có thể là điều mong muốn đã xảy ra, vì nó sẽ cung cấp cho các nhà phát triển một số đòn bẩy về cách sử dụng các chức năng

    Điều này còn được gọi là tung hứng kiểu trong PHP. Tuy nhiên, trong khi một số người có thể thấy hành vi này hữu ích, thì nó cũng có thể có tác dụng phụ không mong muốn khiến các nhà phát triển không nghĩ đến sự khác biệt giữa một chuỗi và một số nguyên hoặc một số float;

    Các lớp được sử dụng như các loại

    Trong PHP, bất kỳ lớp được đặt tên nào cũng có thể được sử dụng làm loại, vì vậy khi khai báo các phụ thuộc, bạn có thể hạn chế loại đối tượng được truyền trong tham số

    Khi thực hiện một cách tiếp cận hướng đối tượng, người ta thường ưu tiên sử dụng các đối tượng thay vì mảng để truyền dữ liệu thông qua nội xạ phụ thuộc tới các đối tượng khác. Một trong những lợi ích chính khi sử dụng các đối tượng thay vì mảng là trình soạn thảo mã của bạn sẽ đưa ra các đề xuất tự động hoàn thành cho các thuộc tính đối tượng và tất nhiên, một lợi ích khác được tìm thấy trong gợi ý kiểu

    Vì các lớp có thể được sử dụng như các kiểu trong PHP, nên bạn có thể tận dụng chúng để đảm bảo rằng định dạng dữ liệu chính xác được truyền cho một đối tượng hoặc hàm phụ thuộc vào dữ liệu cụ thể

    Đây là lớp "người dùng" được sử dụng để tạo đối tượng người dùng mới

    $some_user = new user('Jacob', '[email protected]', 'Earth');
    
    class user {
      public $name;
      public $email;
      public $address;
    
      public function __construct(string $name, string $email, string $address) {
         $this->name    = $name;
         $this->email    = $email;
         $this->address = $address;
      }
    
    }
    

    Sau đó, chỉ cần sử dụng lớp người dùng trong định nghĩa của một lớp hoặc chức năng phụ thuộc vào dữ liệu này

    class show_user {
      public $name;
      public $email;
      public $address;
    
      public function __construct(user $user) {
         $this->user  = $user;
    
         echo $this->user->name;
         exit();
      }
    
    }
    

    Bây giờ, nếu một nhà phát triển cố gắng chuyển một đối tượng sai cho lớp show_user, PHP sẽ đưa ra một lỗi để cảnh báo cho nhà phát triển về sự cố

    Nó có vẻ không nhiều, nhưng việc sử dụng gợi ý kiểu ở cấp độ này sẽ giúp các nhà phát triển sớm bắt lỗi - và nó cũng sẽ làm cho mã tự ghi lại nhiều hơn

    Bạn có nên sử dụng chế độ nghiêm ngặt?

    nghiêm ngặt_types=1 chỉ cần thiết nếu bạn muốn kiểm tra loại nghiêm ngặt đối với các loại vô hướng, nhưng vẫn có một số lợi ích rõ ràng khi bật chế độ nghiêm ngặt;

    Không giống như những gì được nêu trong các bài báo khác trên internet, bạn thực sự không cần đưa nó vào từng tệp. Kích hoạt chế độ nghiêm ngặt là một vấn đề đơn giản bao gồm chỉ thị một lần, ở đầu chỉ mục của bạn. php hoặc khác, khóa, thành phần gốc trong dự án của bạn

    Làm cách nào để tắt chế độ nghiêm ngặt PHP?

    Hãy tìm dòng sau. .
    Bạn có thể thay đổi giá trị của sql_mode thành NO_ENGINE_SUBSTITUTION để tắt hoàn toàn chế độ nghiêm ngặt, nhưng bạn có thể muốn tra cứu từng chế độ được định cấu hình trước khi tắt hoặc bạn chỉ cần thay đổi nó thành. .
    Khởi động lại dịch vụ MySQL

    Làm cách nào để khai báo yêu cầu nghiêm ngặt trong PHP 7?

    PHP 7 là ngôn ngữ được gõ yếu . Việc triển khai này có nghĩa là PHP sẽ 'bỏ qua' các gợi ý nhập và trả về các loại trừ khi khai báo (strict_types=1); . declare(strict_types=1); method at the top of a PHP file. This implementation means that PHP will 'ignore' type hints and return types unless the declare(strict_types=1); statement appears at the top of the file.

    loại nghiêm ngặt là gì?

    Kiểm tra kiểu nghiêm ngặt có nghĩa là nguyên mẫu hàm (chữ ký hàm) phải được biết cho mỗi hàm được gọi và hàm được gọi phải khớp với nguyên mẫu hàm.

    PHP có gõ không?

    Vì PHP kiểm tra loại biến trong thời gian chạy nên nó thường được mô tả là ngôn ngữ được nhập động . Mặt khác, một ngôn ngữ được nhập tĩnh sẽ thực hiện tất cả các kiểm tra loại của nó trước khi mã được thực thi.