通过数组索引访问对象属性

4
我有一个情况,需要以编程方式进行数据库插入。我有多个表格,但这些表格的信息顺序相似,即在每个表格中,第一列是id,第二列是外键,第三列是名称,第四列是blob,第五列是文本。
我搜索了 php文档 并发现可以使用 $objectName[index] 来访问数据库属性。然而我却遇到了错误: Cannot use object of type stdClass as array in C:\....php on line .. 这个错误出现在代码行:
private function uploadTemp($databaseObject, $table_name){
    $this->load->database();
    //get file_contents too;
    $file_id = $databaseObject[3]; // < Here's where the error appeared
    $this->db->from('tbl_file')->where('file_id',$file_id); 
    $q = $this->db->get();
    $data = $q->row();
    $query = "INSERT INTO $table_name VALUES(NULL, '".$databaseObject[2]."','".$data->filecontent."');";
    $this->db->query($query);
}

我正在使用CodeIgniter作为框架。


难道不是标记行的前一行,即$file_id = $databaseObject[3];触发了错误吗? - VolkerK
@VolkerK 第二行触发了那个!这让我很惊讶! - cipher
2个回答

5

尝试转换为数组:

$file_id = (array) $databaseObject[3];

由于STDClass只是一个带有公共动态变量没有方法的虚拟容器,因此将其转换为数组并进行反向转换应该不会出现问题。

然而,在某些情况下,数字用于表示变量名称。

例如:

$array ; //Is some array created by engines / database handlers.

$obj = (object) $array ;

echo $obj->0 ; //Hell it will not work.
echo $obj[0] ; //The same problem.

echo $obj->{'0'} ; //PERFECT

如果您尝试以下代码:$file_id = $databaseObject->{'3'};,会发生什么? - sybear
实际上,我的数据库对象具有不同的标识符(identifier)取决于情况,但在第三个位置具有相同类型的数据!我试图获取第三个数据。我想这个方法是一样的! - cipher
在我看来,CodeIgniter将数据封装到对象中是非常错误的。对象必须包含具有实际名称的属性。数组必须包含数据集并通常是按数字索引的。 - sybear

1

尝试使用此函数get_object_vars()

或者创建一个将对象转换为数组的函数

function array_to_object($array)//from CodeIgniter forum
 {
  return (is_array($array)) ? (object) array_map(__FUNCTION__, $array) : $array;
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接