我创建了一个在其属性中保留一些信息的类。它包含add()方法,该方法将一组新信息添加到此类属性中的所有内容中。
我希望它的对象表现得像数组偏移。例如,调用:
$obj = new Class[0];
将创建包含第一组信息的对象。
我也想在该类上使用foreach()循环。
应该从课外拒绝属性的更改,但我应该可以访问它们。
这可能吗?
答案 0 :(得分:1)
您需要ArrayObject
完全实现IteratorAggregate , Traversable , ArrayAccess , Serializable , Countable
示例
echo "<pre>";
$obj = new Foo(["A","B","C"]);
foreach ( $obj as $data ) {
echo $data, PHP_EOL;
}
echo reset($obj) . end($obj), PHP_EOL; // Use array functions on object
echo count($obj), PHP_EOL; // get total element
echo $obj[1] ; // you can get element
$obj[0] = "D"; // Notice: Sorry array can not be modified
输出
A
B
C
AC
3
B
使用的课程
class Foo extends ArrayObject {
public function offsetSet($offset, $value) {
trigger_error("Sorry array can not be modified");
}
}
答案 1 :(得分:0)
这是您可以使用不同的构造函数值创建多个实例的方法。
$objConfig = array(
array('id'=>1 , 'name'=>'waqar') ,
array('id'=>2 , 'name'=>'alex')
);
$objects = array();
for($i=0; $i<count($objConfig) ; $i++)
{
$objects[$i] = new ClassName($objConfig[$i]);
}
答案 2 :(得分:0)
您需要实现ArrayAccess
接口,示例非常简单。
无论如何,我真的不鼓励你为了糟糕的设计目的而混合类和数组行为:应该使用数组式访问来保持语法更简洁。
充分利用课程,魔术方法,反思:除了关联数组之外,还有一个光明幸福的世界。
答案 3 :(得分:0)
在这种情况下,为什么你不只是有一个类实例的数组?一个非常简单的例子:
/**
* @var MyClass[]
*/
$myClasses = array();
$myClasses[] = new myClass();
或者使用一个更专业的SPL类,这里:http://php.net/manual/en/book.spl.php,例如SplObjectStorage(我没有需要这个,但看起来它可能是你需要的)
最后,您可以通过简单地创建一个扩展ArrayAccess的类并强制执行类类型来自行创建吗?
这实际上取决于你需要什么,对于绝大多数情况我依赖于在数组中存储类并在我的模型中强制执行任何业务逻辑(以便数组值始终是同一个类)。这可能性能较差,但假设您正在创建一个Web应用程序,则高度不太可能是一个问题。