由于我开始在OOP中编写更多代码,因此我总是遇到“代码样式”问题。我想在现有对象中添加一些额外的数据。当我使用数组时,使用foreach很容易实现,因为每个数组项都有自己的键。现在有了对象,我找不到如何使用密钥访问每个项目的方法。
$data_items = $this->model->get_function();
$data_items = (array) $data_items;
foreach ($data_items as $key => $row)
{
$data_items[$key]['additional_data'] = 'additional_data';
}
$data_items = (object) $data_items;
我认为我的代码只是一种解决方法。可以请有人告诉我,如果我可以摆脱代码行“$ data_items =(array)$ data_items;”和“$ data_items =(object)$ data_items;”。
感谢所有回答我问题的人!
到目前为止,我并没有意识到我试图实现这么容易:
foreach ($data_items as $row)
{
$row->additional_data = 'additional_data';
}
答案 0 :(得分:2)
从数据处理的角度来看,对象和数组看起来几乎相同。你可以简单地添加另一个对象属性并将数据保存到它而不必声明所述属性(在我看来,这是一个缺点,但在你的情况下 - 一个优势)。
阵列:
$arr = array();
$arr['additional_data'] = 'foo';
对象:
$obj = new stdClass;
$obj->additional_data = 'bar';
Foreach将处理对象属性,就像处理数组键一样。 而且不需要隐式投射。
这是无铸造变体:
$data_items = $this->model->get_function();
foreach ($resource_contacts as $key => $row)
{
// Note, $data_items->{$key} must be an object, or this will crash.
// You can check if it is with is_object() and react accordingly
$data_items->{$key}->additional_data = 'additional_data';
}
答案 1 :(得分:2)
如果对象实现了Traversable
界面(ArrayAccess
,Iterable
),就像stdClass
一样,您可以轻松地foreach
实例:
$foo = new stdClass;
$foo->bar = 'foobar';
foreach($foo as $property => $value)
{
echo '$foo->'.$property.' === '.$value;
echo $foo->{$property} = 'reassign';
}
如果不实现这些接口,您仍然可以迭代任何对象,但是:只有公共属性才可见。
为了解决这个问题,我倾向于声明我的所有属性都是受保护的,并且让我的所有数据对象都继承自实现Iterator
接口的抽象模型,所以我不必担心它。
答案 2 :(得分:0)
你应该可以这样做:
$data_items = $this->model->get_function();
foreach ($resource_contacts as $key => $row)
{
$data_items->$key->additional_data = 'additional_data';
}
答案 3 :(得分:0)
使用引用可以在foreach
循环内修改对象,如果这是您要实现的目标:
foreach($objectList as &$obj){
$obj->newProperty = 'whatever';
}