2010-07-15 27 views
19

& trước tên chức năng có nghĩa là gì?Điều gì & trước khi tên chức năng biểu thị?

Điều đó có nghĩa là $result được trả lại theo tham chiếu chứ không phải theo giá trị? Nếu có thì điều đó có đúng không? Như tôi nhớ bạn không thể trả về một tham chiếu đến một biến cục bộ khi nó biến mất khi hàm thoát.

function &query($sql) { 
// ... 
$result = mysql_query($sql); 
return $result; 
} 

Ngoài ra, nơi nào một cú pháp như vậy được sử dụng trong thực tiễn ?

Trả lời

7

Điều đó có nghĩa là $result được trả lại theo tham chiếu chứ không phải theo giá trị?

Có.

Ngoài ra cú pháp này được sử dụng ở đâu trong số thực hành?

Điều này phổ biến hơn trong các tập lệnh PHP 4 nơi đối tượng được truyền theo giá trị theo mặc định.

+0

-1 vì nói kết quả $ sẽ chỉ tồn tại trong hàm và do đó sẽ vô dụng. – NikiC

+0

@nikic: Tôi đã trả lời câu trả lời của mình. – BoltClock

+0

OK. Vì vậy, bây giờ tôi cho -1 để nói rằng các đối tượng không được truyền theo giá trị trong PHP 5 nữa ... – NikiC

6

Để trả lời phần thứ hai của câu hỏi của bạn, ở đây một địa điểm ở đó tôi đã phải sử dụng nó: Magic getters!

class FooBar { 
    private $properties = array(); 

    public function &__get($name) { 
     return $this->properties[$name]; 
    } 

    public function __set($name, $value) { 
     $this->properties[$name] = $value; 
    } 
} 

Nếu tôi đã không được sử dụng & có, điều này sẽ không thể thực hiện:

$foobar = new FooBar; 
$foobar->subArray = array(); 
$foobar->subArray['FooBar'] = 'Hallo World!'; 

Thay vì PHP sẽ ném một lỗi nói rằng một cái gì đó như 'không thể gián tiếp thay đổi sở hữu quá tải'.

Được rồi, đây có lẽ chỉ là một hack để làm tròn một số maldesign trong PHP, nhưng nó vẫn hữu ích.

Nhưng thành thật mà nói, tôi không thể nghĩ ngay bây giờ về một ví dụ khác. Nhưng tôi đặt cược có một số trường hợp sử dụng hiếm hoi ...

4

Điều đó có nghĩa là số $result được trả về bằng tham chiếu chứ không phải theo giá trị?

No. Sự khác biệt là có thể được trả lại bằng tham chiếu. Ví dụ:

<?php 
function &a(&$c) { 
    return $c; 
} 
$c = 1; 
$d = a($c); 
$d++; 
echo $c; //echoes 1, not 2! 

Để trở về bằng cách tham khảo bạn phải làm:

<?php 
function &a(&$c) { 
    return $c; 
} 
$c = 1; 
$d = &a($c); 
$d++; 
echo $c; //echoes 2 

Ngoài ra, nơi nào một cú pháp như vậy được sử dụng trong thực tiễn ?

Trong thực tế, bạn sử dụng bất cứ khi nào bạn muốn người gọi hàm của bạn thao tác dữ liệu thuộc sở hữu của callee mà không nói cho anh ta biết. Điều này hiếm khi được sử dụng bởi vì đó là vi phạm đóng gói - bạn có thể đặt tham chiếu được trả về thành bất kỳ giá trị nào bạn muốn; callee sẽ không thể xác nhận nó.

nikic đưa ra ví dụ tuyệt vời về thời điểm được sử dụng trong thực tế.

+0

Nếu hàm không được xác định bằng dấu & trước tên của hàm, bạn vẫn có thể trả về biến với tham chiếu thay vì giá trị không? –

+0

@KhoayTugay no. – Artefacto

Các vấn đề liên quan