Hướng dẫn php 8 non static method cannot be called statically - php 8 non static method không thể được gọi là statically

  • PHP.Watch
  • Phiên bản
  • 8.0

Php 8.0 không còn cho phép gọi các phương thức lớp không tĩnh với toán tử gọi tĩnh (no___trans___pre___9).

Gọi các phương thức không tĩnh đã nêu ra một thông báo không nhận PHP trong tất cả các phiên bản PHP 7 và nêu ra một thông báo tiêu chuẩn nghiêm ngặt trong các phiên bản PHP 5.

class Foo {
    public function bar() {}
}
Foo::bar();

// Deprecated: Non-static method Foo::bar() should not be called statically in ... on line ...

Trong PHP 8.0 trở lên, điều này dẫn đến một lỗi nghiêm trọng:

class Foo {
    public function bar() {}
}
Foo::bar();

// Fatal error: Uncaught Error: Call to undefined method Foo::bar() in ...:...

Lưu ý rằng điều này chỉ ảnh hưởng đến việc gọi các phương thức phi tĩnh một cách thống trị. Mặc dù không được khuyến khích, hãy gọi một phương thức tĩnh không tĩnh (no___trans___pre___10) được cho phép.

Thay đổi này được thực hiện trong toàn bộ động cơ.

Chức năng biến

class Foo {
    public function bar() {}
}

['Foo', 'bar']();
// Fatal error: Uncaught Error: Non-static method Foo::bar() cannot be called statically in ...:...

Đồ gọi

PHP không còn coi một mảng có tên lớp và phương thức (no___trans___pre___11) là một cuộc gọi hợp lệ và dẫn đến một lỗi nghiêm trọng. Điều này bao gồm các chức năng cốt lõi của PHP mong đợi một cuộc gọi. Nếu việc gọi đó được chuyển đến một hàm mong đợi một cuộc gọi hợp lệ, thì NO___Trans___Pre___12 sẽ bị ném thay vì lỗi nghiêm trọng tại giờ gọi.

class Foo {
    public function bar() {}
}

call_user_func(['Foo', 'bar']);
call_user_func_array(['Foo', 'bar'], []);
// Fatal error: Uncaught TypeError: call_user_func(): Argument #1 ($function) must be a valid callback, non-static method Foo::bar() cannot be called statically in ...:...

Điều này ảnh hưởng đến tất cả các chức năng từ no___trans___pre___13 và no___trans___pre___14 đến no___trans___pre___15, no___trans___pre___16, no___trans___pre___16.

NO___Trans___PRE___15 Chức năng trong các phiên bản Php 8.0 cho đến khi Beta3 đưa ra cảnh báo PHP tại thời điểm NO___TRANS___PRE___15 được gọi là thay vì hành vi hiện tại của việc ném ngoại lệ NO___Trans___Pre___12. Điều này đã được sửa chữa trong php beta4.

class Foo {
    public function bar() {}
}

['Foo', 'bar']();
// Fatal error: Uncaught Error: Non-static method Foo::bar() cannot be called statically in ...:...
1

NO___TRANS___PRE___21 Hàm trả về no___trans___pre___23 trên Callable có thể gọi các phương thức phi tĩnh. Nó đã trả lại số ___trans___pre___24 trước PHP 8.0.

class Foo {
    public function bar() {}
}

is_callable(['Foo', 'bar']); // false

No___trans___pre___25, no___trans___pre___26 và no___trans___pre___27

class Foo {
    public function bar() {}
}

['Foo', 'bar']();
// Fatal error: Uncaught Error: Non-static method Foo::bar() cannot be called statically in ...:...
5, no___trans___pre___26 và và không có con trỏ có thể tiếp tục sử dụng cú pháp cuộc gọi tĩnh bên trong một lớp.

class Test extends UpperTest{
    public function foo(): {}
    public function bar() {
        static::foo();
        self::foo();
        parent::foo();
    }
}

Cuộc gọi ở trên vẫn được cho phép vì no___trans___pre___25, no___trans___pre___26 và no___trans___pre___27 được sử dụng bên trong phạm vi lớp.

NO___TRANS___PRE___34 và NO___TRANS___PRE___35 Các cuộc gọi giống hệt với NO___TRANS___PRE___36 Các cuộc gọi trên các phương thức phi tĩnh và cải thiện khả năng đọc. Trong ví dụ trên, NO___Trans___Pre___37 và NO___Trans___Pre___38 có thể được thay thế một cách an toàn bằng NO___Trans___Pre___39 để cải thiện khả năng đọc vì NO___Trans___Pre___40 không phải là phương thức tĩnh.

Tác động tương thích ngược

Đối với mã hiện tại nhận được lỗi gây tử vong trong PHP 8.0, bản sửa lỗi có thể đơn giản như sử dụng cú pháp chính xác nếu có một thể hiện lớp trong cùng một phạm vi.

class Foo {
    public function bar() {}
}

$foo = new Foo();
- Foo::bar();
+ $foo->bar(); 

Nếu không có đối tượng lớp khởi tạo và nếu lớp có thể được khởi tạo mà không có bất kỳ tham số hoặc tác dụng phụ nào, thì đó cũng sẽ là sự thay thế đơn giản.

class Foo {
    public function bar() {}
}

- Foo::bar();
+ (new Foo())->bar(); 

Nếu hàm tạo lớp yêu cầu các tham số hoặc có xu hướng thực hiện bất kỳ thay đổi trạng thái nào, việc sửa chữa có thể phức tạp hơn. Ví dụ cần được đưa vào phạm vi mà cuộc gọi tĩnh được thực hiện.

Lưu ý rằng các chức năng mong đợi tham số NO___Trans___PRE___41 không còn chấp nhận các thiết bị gọi bằng phương thức không tĩnh như phương thức tĩnh. Một ngoại lệ NO___TRANS___PRE___12 sẽ được ném khi có thể gọi được được thông qua, trái ngược với khi người được gọi được gọi.

class Foo {
    public function bar() {}
}
function takeCallable(callable $func) {}

- takeCallable(['Foo', 'bar']);
+ takeCallable([new Foo(), 'bar']);

NO___Trans___PRE___21 Chức năng không còn trả về no___trans___pre___24 cho các thiết bị gọi đó.


Thực hiện