私は、Googleの結果のページだけでなく、ここでstackoverflowを検索しましたが、私の状況に合った解決策を見つけることができません。私はcall_user_func_arrayを使って動的にオブジェクトを作成するビルドしようとしている関数に最後の障害が1つあります。call_user_func_arrayはコンストラクタに引数を渡します
キャッチ可能な致命的なエラーはObject of class Product could not be converted to string
です。エラーが発生した場合、ログにこれらのうちの5つ(各引数に1つ)があります。キャッチ可能な致命的なエラーが発生する前にPHP Warning: Missing argument 1 for Product::__construct(),
。
これは、関数のコードです:
今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;
}
、私はcall_user_func_array行をコメントアウトし、これに置き換える場合:
$array[] = new $class($args[0],$args[1],$args[2],$args[3],$args[4]);
ページが読み込まそれが必要、と移入します私が作るテーブル。実際には私が$args
配列をcall_user_func_array
に実際に使用しようとするまで、すべてが絶対に機能します。
私は行方不明の配列を呼び出すことについていくつか微妙な詳細がありますか? call_user_func_arrayのPHPマニュアルを一度読んだところ、そのページのいくつかの例は、配列を作成して2番目の引数のために呼び出すだけの人に見えていたようでした。私は何が間違っていますか?
ありがとう、私は '有効なコールバック'エラーを得ていないし、エラー'call_user_func_array'は、特定のコンストラクタが期待している何らかの理由で、PHPの警告:Product :: __ construct()の引数1がありません。受信する。もちろん、それは私がまだ理解していないものかもしれませんが、それは私がこれまで持っている知識です。 – tuespetre
最初にオブジェクトを 'new $ class'でインスタンス化します。これは、 'call_user_func_array' getが動作する前にコンストラクタがすでに呼び出されていることを意味します。分かりますか?最初に 'new'が来ました。なぜなら、それをパラメータの式として使用してから、関数呼び出しが起こるからです。しかし、新しいものが実行されたため、 '$ class'のコンストラクタはすでに(引数なしで)呼び出されています。そして、PHPはオブジェクトを文字列に変換しようとします。なぜなら、最初のパラメータは文字列または配列を必要とするからです。オブジェクトが文字列へのキャストをサポートしていないため、エラー/警告が表示されます。 – hakre
私は見る!ありがとうございました。私は、引数をコンストラクタに動的に渡す他の方法を検討します。 – tuespetre