2009-10-09 25 views
6

Tôi muốn gọi hàm bằng call_user_func_array nhưng tôi nhận thấy rằng nếu đối số là tham chiếu trong định nghĩa hàm và là giá trị đơn giản trong call_user_func_array, cảnh báo sau sẽ xuất hiện: Cảnh báo: Tham số 1 để kiểm tra() được mong đợi là tài liệu tham khảo, giá trị nhất địnhPHP Làm thế nào để biết một biến là một tham chiếu?

đây là một ví dụ đơn giản về những gì tôi đang cố gắng để làm:

<?php 
$a = 0; 
$args = array($a); 
function test(&$a) { 
    $a++; 
} 
$a = 0; 
call_user_func_array('test', $args); 
?> 

câu hỏi của tôi là: làm thế nào tôi có thể biết nếu một giá trị (trong trường hợp này giá trị đầu tiên của $ args) là một tham chiếu hay không?

Trả lời

2

Kiểm tra các ý kiến ​​trên trang tài liệu PHP này:

http://php.net/manual/en/language.references.spot.php

+1

Tất cả tôi thấy là chức năng để kiểm tra xem hai mảng/đối tượng/biến được trỏ đến vùng nhớ cùng bằng cách sửa đổi một và kiểm tra nếu một cái khác cũng được sửa đổi. Trong mã của tôi (không phải ví dụ, một thực tế), tôi chỉ có các mảng đối số và tôi muốn biết nếu một đối số là một tham chiếu. Bằng cách đó, tôi có thể ném một lỗi nếu hàm gọi lại muốn tham chiếu và mảng chứa một giá trị đơn giản. –

+0

Nó đã kích hoạt cảnh báo, dành cho nhà phát triển. Bạn muốn loại lỗi nào? Bạn có thể [thiết lập một trình xử lý lỗi tùy chỉnh] (http://php.net/set_error_handler) nếu bạn muốn thay đổi hành vi – cmbuckley

4

Không, vấn đề là các tham số đầu tiên của hàm là pass-by-reference (có nghĩa là chức năng có thể sửa đổi các tham số trong phạm vi của người gọi). Vì vậy, bạn phải vượt qua một biến hoặc cái gì đó có thể gán như là đối số đầu tiên. Khi bạn tạo mảng như array($a), nó chỉ sao chép giá trị của biến số $a (là 0) vào một vị trí trong mảng. Nó không tham chiếu đến biến số $a theo bất kỳ cách nào. Và sau đó khi bạn gọi hàm, nó là như nếu bạn đang làm điều này, mà không làm việc:

test(0) 

Nếu bạn thực sự muốn, bạn có thể đặt $a vào mảng bằng cách tham khảo, nhưng nó kinda khó khăn :

<?php 
$a = 0; 
$args = array(&$a); 
function test(&$a) { 
    $a++; 
} 
call_user_func_array('test', $args); 
?> 

Như bạn biết, phần tử mảng là tham chiếu ... thật khó. Bạn có thể làm var_dump() trên mảng, và tìm kiếm các "&" biểu tượng:

> var_dump($args); 
array(1) { 
    [0]=> 
    &int(1) 
} 
+0

Có, tôi biết rằng mã hoạt động theo cách đó. Tôi chỉ muốn một cách để đảm bảo rằng mảng $ args (có thể chứa bất kỳ thứ gì, vì trong mã của tôi nó được truyền bởi một hàm khác) đã được tạo theo cách đó để tránh bất kỳ lỗi nào khi tôi gọi call_user_func_array. Đó là lý do tại sao tôi muốn biết cách kiểm tra xem các biến trong mảng có tham chiếu hay không. –

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