Hướng dẫn can i call non static method from static method php? - tôi có thể gọi phương thức không tĩnh từ php phương thức tĩnh không?

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

Hướng dẫn can i call non static method from static method php? - tôi có thể gọi phương thức không tĩnh từ php phương thức tĩnh không?

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();
3

Chỉ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

Hướng dẫn can i call non static method from static method php? - tôi có thể gọi phương thức không tĩnh từ php phương thức tĩnh không?

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 (

class Foo {

    public function fun1()
    {
        return 'non-static';
    }

    public static function fun2()
    {
        return (new self)->fun1();
    }
}

echo Foo::fun2();
6) đượ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 (

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

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 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
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 được gọi là thay vì hành vi hiện tại của việc ném ngoại lệ
class Foo {

    public function fun1()
    {
        return 'non-static';
    }

    public static function fun2()
    {
        return (new self)->fun1();
    }
}

echo Foo::fun2();
8. Điều này đã được sửa chữa trong php beta4.

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

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();
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();
0

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 fun1()
    {
        return 'non-static';
    }

    public static function fun2()
    {
        return (new self)->fun1();
    }
}

echo Foo::fun2();
1

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 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();
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');
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

Chúng ta có thể gọi phương thức không tĩnh từ tĩnh không?

Một phương thức tĩnh chỉ có thể gọi các phương thức tĩnh khác; Nó không thể gọi một phương thức phi tĩnh.it cannot call a non-static method.

Làm thế nào để bạn gọi một phương thức không tĩnh từ một lớp tĩnh?

Nhưng khi chúng tôi cố gắng gọi hàm không tĩnh, tức là, testMethod () bên trong hàm tĩnh, nó sẽ gây ra lỗi - Chương trình giới thiệu đối tượng cho trường không tĩnh, thành viên hoặc thuộc tính.Phương pháp kiểm tra()".Vì vậy, chúng ta cần tạo một thể hiện của lớp để gọi phương thức không tĩnh.

Chúng ta có thể sử dụng biến không tĩnh trong phương pháp tĩnh PHP không?

Phương thức tĩnh sẽ không có quyền truy cập vào $ này (vì không có $ điều này để nói trong bối cảnh tĩnh).Nếu bạn cần một tham chiếu đến đối tượng hiện tại trong phương thức tĩnh, nó không phải là phương thức tĩnh.Tuy nhiên, bạn có thể truy cập các thuộc tính và chức năng tĩnh từ một phương thức không tĩnh. A static method will not have access to $this (as there is no $this to talk about in a static context). If you need a reference to the current object within the static method, it is not a static method. You can however access static properties and functions from a non-static method.

Chúng ta có thể gọi phương thức không tĩnh từ phương pháp chính không?

Để gọi một phương thức phi tĩnh từ chính trong java, trước tiên bạn cần tạo một thể hiện của lớp, đăng mà chúng ta có thể gọi bằng objectName.methodName ().you first need to create an instance of the class, post which we can call using objectName. methodName().