58
Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.
Tôi đang làm việc trên mã PHP.
Đây là mã mẫu để giải thích vấn đề của tôi:
class Foo {
public function fun1[] {
echo 'non-static';
}
public static function fun2[] {
echo "static" ;
//self::fun1[];
//Foo::fun1[];
}
}
Làm thế nào tôi có thể gọi phương thức phi tĩnh từ phương thức tĩnh?
Lưu ý: Cả hai chức năng đều được sử dụng trên toàn bộ trang web, không được biết đến. Tôi không thể thực hiện bất kỳ thay đổi nào trong bản chất tĩnh/không tĩnh của chúng. Both functions are used throughout the site, which is not known. I can't make any changes in the static/non-static nature of them.
Đã hỏi ngày 13 tháng 1 năm 2017 lúc 9:46Jan 13, 2017 at 9:46
RahulrahulRahul
Huy hiệu vàng 18K740 Huy hiệu bạc58 Huy hiệu đồng7 gold badges40 silver badges58 bronze badges
6
Bạn phải tạo một đối tượng mới bên trong phương thức tĩnh để truy cập các phương thức không tĩnh bên trong lớp đó:
class Foo {
public function fun1[]
{
return 'non-static';
}
public static function fun2[]
{
return [new self]->fun1[];
}
}
echo Foo::fun2[];
Kết quả sẽ là
class Foo {
public function fun1[]
{
return 'non-static';
}
public static function fun2[]
{
return [new self]->fun1[];
}
}
echo Foo::fun2[];
3Chỉnh sửa sau: Như đã thấy sự quan tâm trong việc chuyển các biến cho hàm tạo, tôi sẽ đăng một phiên bản cập nhật của lớp:
class Foo {
private $foo;
private $bar;
public function __construct[$foo, $bar]
{
$this->foo = $foo;
$this->bar = $bar;
}
public function fun1[]
{
return $this->foo . ' - ' . $this->bar;
}
public static function fun2[$foo, $bar]
{
return [new self[$foo, $bar]]->fun1[];
}
}
echo Foo::fun2['foo', 'bar'];
Kết quả sẽ là
class Foo {
public function fun1[]
{
return 'non-static';
}
public static function fun2[]
{
return [new self]->fun1[];
}
}
echo Foo::fun2[];
4Đã trả lời ngày 13 tháng 1 năm 2017 lúc 9:51Jan 13, 2017 at 9:51
Mihai Mateimihai MateiMihai Matei
23.9K5 Huy hiệu vàng33 Huy hiệu bạc 50 Huy hiệu Đồng5 gold badges33 silver badges50 bronze badges
3
Sự khác biệt chính là bạn có thể gọi các phương thức tĩnh cho một lớp mà không phải khởi tạo một đối tượng của lớp đó. Vì vậy, trong phương pháp tĩnh của bạn, hãy thử
Foo $objInst = new Foo[];
$objInst->fun1[];
Nhưng tôi không thấy làm thế nào điều này sẽ có ý nghĩa trong bất kỳ bối cảnh nào.
Đã trả lời ngày 13 tháng 1 năm 2017 lúc 9:56Jan 13, 2017 at 9:56
1
- 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ử cuộc gọi tĩnh [
class Foo {
public function fun1[]
{
return 'non-static';
}
public static function fun2[]
{
return [new self]->fun1[];
}
}
echo Foo::fun2[];
5].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 [
6] được cho phép.class Foo { public function fun1[] { return 'non-static'; } public static function fun2[] { return [new self]->fun1[]; } } echo Foo::fun2[];
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 [
class Foo {
public function fun1[]
{
return 'non-static';
}
public static function fun2[]
{
return [new self]->fun1[];
}
}
echo Foo::fun2[];
7] 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ệ, một class Foo {
public function fun1[]
{
return 'non-static';
}
public static function fun2[]
{
return [new self]->fun1[];
}
}
echo Foo::fun2[];
8 sẽ bị ném thay vì lỗi nghiêm trọng tại thời gian 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ừ
class Foo {
public function fun1[]
{
return 'non-static';
}
public static function fun2[]
{
return [new self]->fun1[];
}
}
echo Foo::fun2[];
9 và class Foo {
private $foo;
private $bar;
public function __construct[$foo, $bar]
{
$this->foo = $foo;
$this->bar = $bar;
}
public function fun1[]
{
return $this->foo . ' - ' . $this->bar;
}
public static function fun2[$foo, $bar]
{
return [new self[$foo, $bar]]->fun1[];
}
}
echo Foo::fun2['foo', 'bar'];
0 đến class Foo {
private $foo;
private $bar;
public function __construct[$foo, $bar]
{
$this->foo = $foo;
$this->bar = $bar;
}
public function fun1[]
{
return $this->foo . ' - ' . $this->bar;
}
public static function fun2[$foo, $bar]
{
return [new self[$foo, $bar]]->fun1[];
}
}
echo Foo::fun2['foo', 'bar'];
1, class Foo {
private $foo;
private $bar;
public function __construct[$foo, $bar]
{
$this->foo = $foo;
$this->bar = $bar;
}
public function fun1[]
{
return $this->foo . ' - ' . $this->bar;
}
public static function fun2[$foo, $bar]
{
return [new self[$foo, $bar]]->fun1[];
}
}
echo Foo::fun2['foo', 'bar'];
2, class Foo {
private $foo;
private $bar;
public function __construct[$foo, $bar]
{
$this->foo = $foo;
$this->bar = $bar;
}
public function fun1[]
{
return $this->foo . ' - ' . $this->bar;
}
public static function fun2[$foo, $bar]
{
return [new self[$foo, $bar]]->fun1[];
}
}
echo Foo::fun2['foo', 'bar'];
2.Hàm
1 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ểmclass Foo { private $foo; private $bar; public function __construct[$foo, $bar] { $this->foo = $foo; $this->bar = $bar; } public function fun1[] { return $this->foo . ' - ' . $this->bar; } public static function fun2[$foo, $bar] { return [new self[$foo, $bar]]->fun1[]; } } echo Foo::fun2['foo', 'bar'];
1 được gọi là thay vì hành vi hiện tại của việc ném ngoại lệclass Foo { private $foo; private $bar; public function __construct[$foo, $bar] { $this->foo = $foo; $this->bar = $bar; } public function fun1[] { return $this->foo . ' - ' . $this->bar; } public static function fun2[$foo, $bar] { return [new self[$foo, $bar]]->fun1[]; } } echo Foo::fun2['foo', 'bar'];
8. Điều này đã được sửa chữa trong php beta4.class Foo { public function fun1[] { return 'non-static'; } public static function fun2[] { return [new self]->fun1[]; } } echo Foo::fun2[];
class Foo {
private $foo;
private $bar;
public function __construct[$foo, $bar]
{
$this->foo = $foo;
$this->bar = $bar;
}
public function fun1[]
{
return $this->foo . ' - ' . $this->bar;
}
public static function fun2[$foo, $bar]
{
return [new self[$foo, $bar]]->fun1[];
}
}
echo Foo::fun2['foo', 'bar'];
7
class Foo {
private $foo;
private $bar;
public function __construct[$foo, $bar]
{
$this->foo = $foo;
$this->bar = $bar;
}
public function fun1[]
{
return $this->foo . ' - ' . $this->bar;
}
public static function fun2[$foo, $bar]
{
return [new self[$foo, $bar]]->fun1[];
}
}
echo Foo::fun2['foo', 'bar'];
Hàm
class Foo {
private $foo;
private $bar;
public function __construct[$foo, $bar]
{
$this->foo = $foo;
$this->bar = $bar;
}
public function fun1[]
{
return $this->foo . ' - ' . $this->bar;
}
public static function fun2[$foo, $bar]
{
return [new self[$foo, $bar]]->fun1[];
}
}
echo Foo::fun2['foo', 'bar'];
7 Trả về class Foo {
private $foo;
private $bar;
public function __construct[$foo, $bar]
{
$this->foo = $foo;
$this->bar = $bar;
}
public function fun1[]
{
return $this->foo . ' - ' . $this->bar;
}
public static function fun2[$foo, $bar]
{
return [new self[$foo, $bar]]->fun1[];
}
}
echo Foo::fun2['foo', 'bar'];
9 trên Callable có thể gọi các phương thức phi tĩnh một cách độc đáo. Nó đã trả lại Foo $objInst = new Foo[];
$objInst->fun1[];
0 trước PHP 8.0.class Foo {
public function bar[] {}
}
is_callable[['Foo', 'bar']]; // false
Foo $objInst = new Foo[];
$objInst->fun1[];
1, Foo $objInst = new Foo[];
$objInst->fun1[];
2 và Foo $objInst = new Foo[];
$objInst->fun1[];
3
Foo $objInst = new Foo[];
$objInst->fun1[];
Foo $objInst = new Foo[];
$objInst->fun1[];
Foo $objInst = new Foo[];
$objInst->fun1[];
Foo $objInst = new Foo[];
$objInst->fun1[];
1, Foo $objInst = new Foo[];
$objInst->fun1[];
2 và con trỏ Foo $objInst = new Foo[];
$objInst->fun1[];
3 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ì
Foo $objInst = new Foo[];
$objInst->fun1[];
1, Foo $objInst = new Foo[];
$objInst->fun1[];
2 và Foo $objInst = new Foo[];
$objInst->fun1[];
3 được sử dụng trong phạm vi lớp.Các cuộc gọi
class Foo {
public function bar[] {}
}
Foo::bar[];
// Deprecated: Non-static method Foo::bar[] should not be called statically in ... on line ...
0 và class Foo {
public function bar[] {}
}
Foo::bar[];
// Deprecated: Non-static method Foo::bar[] should not be called statically in ... on line ...
1 giống hệt với các cuộc gọi class Foo {
public function bar[] {}
}
Foo::bar[];
// Deprecated: Non-static method Foo::bar[] should not be called statically in ... on line ...
2 trên các phương thức không tĩnh và cải thiện khả năng đọc. Trong ví dụ trên, các cuộc gọi class Foo {
public function bar[] {}
}
Foo::bar[];
// Deprecated: Non-static method Foo::bar[] should not be called statically in ... on line ...
3 và class Foo {
public function bar[] {}
}
Foo::bar[];
// Deprecated: Non-static method Foo::bar[] should not be called statically in ... on line ...
4 có thể được thay thế một cách an toàn bằng class Foo {
public function bar[] {}
}
Foo::bar[];
// Deprecated: Non-static method Foo::bar[] should not be called statically in ... on line ...
5 để cải thiện khả năng đọc vì class Foo {
public function bar[] {}
}
Foo::bar[];
// Deprecated: Non-static method Foo::bar[] should not be called statically in ... on line ...
6 không phải là phương pháp 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 fun1[]
{
return 'non-static';
}
public static function fun2[]
{
return [new self]->fun1[];
}
}
echo Foo::fun2[];
0Nế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 fun1[]
{
return 'non-static';
}
public static function fun2[]
{
return [new self]->fun1[];
}
}
echo Foo::fun2[];
1Nế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 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ố
class Foo {
public function bar[] {}
}
Foo::bar[];
// Deprecated: Non-static method Foo::bar[] should not be called statically in ... on line ...
7 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 làm phương thức tĩnh. Một ngoại lệ class Foo {
public function fun1[]
{
return 'non-static';
}
public static function fun2[]
{
return [new self]->fun1[];
}
}
echo Foo::fun2[];
8 sẽ bị ném khi người gọi được thông qua, trái ngược với khi người được gọi được gọi.class Foo {
public function fun1[]
{
return 'non-static';
}
public static function fun2[]
{
return [new self]->fun1[];
}
}
echo Foo::fun2[];
2class Foo {
private $foo;
private $bar;
public function __construct[$foo, $bar]
{
$this->foo = $foo;
$this->bar = $bar;
}
public function fun1[]
{
return $this->foo . ' - ' . $this->bar;
}
public static function fun2[$foo, $bar]
{
return [new self[$foo, $bar]]->fun1[];
}
}
echo Foo::fun2['foo', 'bar'];
7 Hàm không còn trả về Foo $objInst = new Foo[];
$objInst->fun1[];
0 cho các vật liệu gọi đó.Thực hiện