Có nghĩa là gì để bắt đầu một chức năng PHP với một dấu và?


129

Tôi đang sử dụng thư viện Facebook có mã này trong đó:

class FacebookRestClient {
...
    public function &users_hasAppPermission($ext_perm, $uid=null) {
        return $this->call_method('facebook.users.hasAppPermission', 
        array('ext_perm' => $ext_perm, 'uid' => $uid));
    }
...
}

Ý nghĩa của & ở đầu định nghĩa hàm là gì và làm thế nào để tôi sử dụng một thư viện như thế này (trong một ví dụ đơn giản)

Câu trả lời:


157

Dấu và trước tên hàm có nghĩa là hàm sẽ trả về tham chiếu đến một biến thay vì giá trị.

Trả về bằng tham chiếu rất hữu ích khi bạn muốn sử dụng hàm để tìm biến tham chiếu nào cần tham chiếu. Không sử dụng trả về tham chiếu để tăng hiệu suất. Động cơ sẽ tự động tối ưu hóa điều này. Chỉ trả lại tài liệu tham khảo khi bạn có lý do kỹ thuật hợp lệ để làm như vậy.

Xem tài liệu tham khảo trở về .


1
Vì vậy, không đi sâu vào chi tiết, bạn sẽ gọi (với lớp được khởi tạo) một cái gì đó như $ results = $ facebook-> users_hasAppPermission ($ param1, $ param2); ? Tôi đoán tôi không chắc về sắc thái ở đây, cảm ơn vì sự giúp đỡ.
Alex Mcp

2
Đúng - Tôi chỉ gọi nó như thế.
Dominic Rodger

16

Nó trả về một tài liệu tham khảo, như đã đề cập. Trong PHP 4, các đối tượng được gán theo giá trị, giống như bất kỳ giá trị nào khác. Điều này rất không trực quan và trái với cách mà hầu hết các ngôn ngữ khác hoạt động.

Để giải quyết vấn đề, các tham chiếu đã được sử dụng cho các biến chỉ vào các đối tượng. Trong PHP 5, các tài liệu tham khảo rất hiếm khi được sử dụng. Tôi đoán đây là mã kế thừa hoặc mã cố gắng duy trì khả năng tương thích ngược với PHP 4.


Đây là thư viện PHP Facebook chính thức, FWIW.
Alex Mcp

4
@Alex: Trong trường hợp đó, có lẽ họ đang làm điều đó để bảo vệ các tin tặc thông thường, những người sử dụng php4, từ chính họ. Bạn không nên làm điều này trong mã của riêng bạn - Nó không được dùng nữa.
troelskn

3
"Điều này rất không trực quan và trái với cách mà hầu hết các ngôn ngữ khác hoạt động" Tôi không thể không đồng ý nhiều hơn.
Các cuộc đua nhẹ nhàng trong quỹ đạo

5
@WildlyInacc chính xác: Việc gán các đối tượng theo tham chiếu theo mặc định, đó là những gì xảy ra trong .NET và trong Java (tôi nghĩ), rất không trực quan. Trong hầu hết các ngôn ngữ khác, việc gán được thực hiện bằng bản sao, cho dù bạn có "đối tượng" hay nguyên thủy hay bất cứ điều gì, và vì đây là trường hợp kể từ buổi bình minh của thời gian, đây là điều mà thế giới phải mắc kẹt.
Các cuộc đua nhẹ nhàng trong quỹ đạo

4
Cho dù một cái gì đó là trực quan có lẽ là khá chủ quan. Nhưng đối với các ngôn ngữ khác với PHP, định mức là truyền các đối tượng bằng tham chiếu. Liên quan đến OOP, tôi sẽ nói rằng đó là cách trực quan nhất, vì OOP là về trạng thái đóng gói, vì vậy các chương trình thường sẽ đề cập đến trạng thái đó, thay vì nhân bản nó.
troelskn

4

Điều này thường được biết đến trong PHP là Trở về tham chiếu hoặc Trả về bằng tham chiếu .

Trả về bằng tham chiếu rất hữu ích khi bạn muốn sử dụng hàm để tìm biến tham chiếu nào cần tham chiếu. Không sử dụng trả về tham chiếu để tăng hiệu suất. Động cơ sẽ tự động tối ưu hóa điều này. Chỉ trả lại tài liệu tham khảo khi bạn có lý do kỹ thuật hợp lệ để làm như vậy.

Tài liệu PHP về Trở về tham chiếu

Một tham chiếu trong PHP chỉ đơn giản là một tên khác được gán cho nội dung của một biến. Tài liệu tham khảo PHP không giống như con trỏ trong lập trình C , chúng không phải là địa chỉ bộ nhớ thực tế, vì vậy chúng không thể được sử dụng cho mỹ phẩm con trỏ.

Khái niệm về các tài liệu tham khảo trở lại có thể rất khó hiểu đặc biệt là cho người mới bắt đầu, vì vậy một ví dụ sẽ hữu ích.

$populationCount = 120;

function &getPopulationCount() {
  global $populationCount;
  return $populationCount;
}

$countryPopulation =& getPopulationCount();
$countryPopulation++;
echo "\$populationCount = $populationCount\n"; // Output: $populationCount = 121 
echo "\$countryPopulation = $countryPopulation\n"; //Output: $countryPopulation = 121 

Hàm getPopulationCount()được xác định trước &, trả về tham chiếu đến nội dung hoặc giá trị của $populationCount. Vì vậy, tăng $countryPopulation, cũng tăng $populationCount.

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.