Tôi đã tìm kiếm nhiều trang kết quả của Google cũng như ở đây trên stackoverflow nhưng không thể tìm thấy giải pháp có vẻ phù hợp với tình huống của tôi. Tôi xuất hiện để có nhưng một snag cuối cùng trong chức năng tôi đang cố gắng để xây dựng, trong đó sử dụng call_user_func_array để tự động tạo ra các đối tượng.call_user_func_array truyền đối số cho một hàm tạo
Lỗi nghiêm trọng gây tử vong mà tôi nhận được là Object of class Product could not be converted to string
. Khi lỗi xảy ra, trong nhật ký tôi nhận được năm trong số này (một cho mỗi đối số): PHP Warning: Missing argument 1 for Product::__construct(),
trước khi lỗi gây tử vong có thể bắt được.
Đây là mã của hàm:
public static function SelectAll($class, $table, $sort_field, $sort_order = "ASC")
{
/* First, the function performs a MySQL query using the provided arguments. */
$query = "SELECT * FROM " .$table. " ORDER BY " .$sort_field. " " .$sort_order;
$result = mysql_query($query);
/* Next, the function dynamically gathers the appropriate number and names of properties. */
$num_fields = mysql_num_fields($result);
for($i=0; $i < ($num_fields); $i++)
{
$fetch = mysql_fetch_field($result, $i);
$properties[$i] = $fetch->name;
}
/* Finally, the function produces and returns an array of constructed objects.*/
while($row = mysql_fetch_assoc($result))
{
for($i=0; $i < ($num_fields); $i++)
{
$args[$i] = $row[$properties[$i]];
}
$array[] = call_user_func_array (new $class, $args);
}
return $array;
}
Bây giờ, nếu tôi nhận xét ra dòng call_user_func_array và thay thế nó với điều này:
$array[] = new $class($args[0],$args[1],$args[2],$args[3],$args[4]);
Các tải trang như mong muốn, và populates cái bàn tôi đang xây. Vì vậy, tất cả mọi thứ là hoàn toàn chức năng cho đến khi tôi cố gắng thực sự sử dụng mảng $args
của mình trong phạm vi call_user_func_array
.
Có một số chi tiết tinh tế về việc gọi mảng đó mà tôi đang thiếu không? Tôi đọc hướng dẫn PHP cho call_user_func_array một lần, và sau đó một số, và các ví dụ trên trang đó dường như cho thấy mọi người chỉ xây dựng một mảng và gọi nó cho đối số thứ hai. Tôi có thể làm gì sai?
Cảm ơn bạn đã trả lời, tuy nhiên, tôi không nhận được lỗi 'không gọi lại hợp lệ' và lỗi log dường như chỉ ra rằng 'call_user_func_array' thực hiện thành công việc gọi cấu trúc, vì nó cho tôi một' PHP Warning: Thiếu đối số 1 cho Product :: __ construct() 'cho mỗi trong số năm đối số mà hàm tạo cụ thể mong đợi nhưng vì một số lý do nhận được. Tất nhiên, nó có thể là một cái gì đó tôi chưa hiểu, nhưng đó là kiến thức tôi có cho đến nay. – tuespetre
Bạn lần đầu tiên khởi tạo đối tượng với 'new $ class'. Điều đó có nghĩa là hàm tạo đã được gọi trước khi 'call_user_func_array' get vào hành động. Bạn thấy không? Đầu tiên là 'new' bởi vì bạn sử dụng nó như là một biểu thức trong tham số, sau đó gọi hàm sẽ xảy ra. Nhưng vì mới được thực hiện, hàm tạo của '$ class' đã được gọi (không có đối số). Và sau đó PHP cố gắng chuyển đổi đối tượng thành một chuỗi bởi vì tham số đầu tiên mong đợi một chuỗi hoặc mảng. Vì đối tượng của bạn không hỗ trợ truyền tới chuỗi, bạn nhận được lỗi/cảnh báo. – hakre
Tôi hiểu! Cảm ơn bạn. Tôi sẽ xem xét các cách khác để tự động chuyển các đối số cho một hàm tạo. – tuespetre