hàm tĩnh php


108

Tôi có một câu hỏi liên quan đến chức năng tĩnh trong php.

giả sử rằng tôi có một lớp học

class test {
    public function sayHi() {
        echo 'hi';
    }
}

nếu tôi làm test::sayHi();nó hoạt động mà không có vấn đề.

class test {
    public static function sayHi() {
        echo 'hi';
    }
}

test::sayHi(); hoạt động tốt.

Sự khác biệt giữa hạng nhất và hạng hai là gì?

Điều gì đặc biệt về một hàm tĩnh?


15
Tính đến php7 bạn không thể gọi phương thức không tĩnh tĩnh
Yadav Sanjay

Câu trả lời:


153

Trong lớp đầu tiên, sayHi()thực sự là một phương thức thể hiện mà bạn đang gọi như một phương thức tĩnh và bạn bỏ qua nó vì sayHi()không bao giờ đề cập đến $this.

Các hàm static được liên kết với lớp, không phải là một thể hiện của lớp. Do đó, $thiskhông có sẵn từ ngữ cảnh tĩnh ( $thiskhông trỏ đến bất kỳ đối tượng nào).


22
Giờ đây, việc gọi tĩnh của các phương thức không phải tĩnh hoạt động nhưng không được chấp nhận. Hãy cẩn thận khi sử dụng cú pháp này cho các phương thức ví dụ!
Máy bay phản lực

1
Vì vậy, đây là lý do tại sao họ nói nó là hàm tĩnh? bởi vì không có nhiều cá thể với luồng dữ liệu động và đầu ra động. Chỉ cần hướng dẫn tôi. @ Hỗn loạn
CN

22

Đơn giản, các hàm tĩnh hoạt động độc lập với lớp mà chúng thuộc về.

$ điều này có nghĩa là, đây là một đối tượng của lớp này. Nó không áp dụng cho các hàm tĩnh.

class test {
    public function sayHi($hi = "Hi") {
        $this->hi = $hi;
        return $this->hi;
    }
}
class test1 {
    public static function sayHi($hi) {
        $hi = "Hi";
        return $hi;
    }
}

//  Test
$mytest = new test();
print $mytest->sayHi('hello');  // returns 'hello'
print test1::sayHi('hello');    //  returns 'Hi'

9
Được rồi, tôi không phải là trình hướng dẫn PHP, nhưng không phải biến ('hello') được chuyển cho hàm tĩnh, rõ ràng đang bị ghi đè bằng 'Hi'? Có nghĩa là dòng in test1 :: sayHi ('hello'); sẽ không trả về 'xin chào', nhưng sẽ trả về 'chào'?
Fnord 23

6
Câu trả lời này khá cẩu thả (tác dụng của các hàm tĩnh có thể phụ thuộc vào lớp chúng nằm trong lớp nào) và các ví dụ không làm rõ vấn đề.
reinierpost

Không phải là một ví dụ rất tốt. $ hi = 'Xin chào'; ghi đè đối số đã cho và không liên quan gì đến khai báo tĩnh. Tôi sẽ sửa lỗi này như sau: self :: $ hi = $ hi; và nó sẽ hoạt động giống như không tĩnh. Bạn có thể truy cập các biến lớp bằng self :: thay vì $ this->
GotBataries

20

Hoàn toàn khác biệt là, bạn không được $thiscung cấp bên trong hàm tĩnh. Nếu bạn cố gắng sử dụng $this, bạn sẽ nhận được một Fatal error: Using $this when not in object context.

Chà, được rồi, một điểm khác biệt nữa: E_STRICTcảnh báo được tạo bởi ví dụ đầu tiên của bạn.


1
tôi không có cảnh báo khi tôi sử dụng đầu tiên và tôi đang ở php7
Ashkan nasirzadeh

Tại sao chúng ta không có $ this bên trong một hàm tĩnh? Logic kiến ​​trúc của điều này là gì? Cảm ơn.
Lucas Bustamante

@LucasBustamante: $thisđề cập đến đối tượng hiện tại. Trong một hàm tĩnh, không có đối tượng hiện tại; hàm tồn tại trên lớp mà không cần hoặc tham chiếu đến một cá thể đối tượng của lớp đó.
hỗn loạn

3

Việc gọi các phương thức không tĩnh sẽ tạo ra một cảnh báo mức E_STRICT.


2

Tóm lại, bạn không có đối tượng là $ this trong trường hợp thứ hai, vì phương thức tĩnh là một hàm / phương thức của lớp không phải là cá thể đối tượng.


1
static là cách bạn định nghĩa các hàm lớp? không có kinh doanh ưa thích khác? Vì vậy, bạn đang nói nếu nó được gọi là "class_method" thay vì "static", nó sẽ có ngữ nghĩa hơn?
ahnbizcad

1

Sau khi thử các ví dụ (PHP 5.3.5), tôi thấy rằng trong cả hai trường hợp xác định hàm, bạn không thể sử dụng $thistoán tử để làm việc trên các hàm lớp. Vì vậy, tôi chưa thể tìm thấy sự khác biệt trong chúng. :(

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.