0

我创建了一个在其属性中保留一些信息的类。它包含 add() 方法,该方法将一组新信息添加到此类属性中的所有当前。

我希望它的对象表现得像数组偏移量。例如,调用:

$obj = new Class[0];

将创建包含第一组信息的对象。

我还想在该类上使用 foreach() 循环。

应该从类外部拒绝属性的更改,但我应该可以访问它们。

那可能吗?

4

4 回答 4

1

你需要的是ArrayObjectIteratorAggregate , 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");
    }
}
于 2012-11-23T12:48:13.283 回答
0

在这种情况下,为什么不只拥有一个类实例数组?一个非常简单的例子:

/**
 * @var MyClass[]
 */
$myClasses = array();

$myClasses[] = new myClass();

或者使用更专业的 SPL 类之一,在这里:http ://php.net/manual/en/book.spl.php,例如 SplObjectStorage(我不需要这个,但它看起来像可能是你需要的)

最后,您可以通过简单地创建一个扩展 ArrayAccess 并强制您的类类型的类来创建自己的类?

这实际上取决于您需要什么,对于绝大多数情况,我将依赖于将类存储在数组中并在我的模型中强制执行任何业务逻辑(以便数组值始终是同一个类)。这可能性能较差,但假设您正在制作一个网络应用程序,这不太可能成为问题。

于 2012-11-23T12:48:06.047 回答
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]);
}
于 2012-11-23T12:35:08.293 回答
0

您需要实现ArrayAccess接口,示例非常简单。

无论如何,我真的不鼓励你为了糟糕的设计目的而混合类和数组行为:应该使用数组访问来保持语法更简洁。

充分利用类、魔法方法和反射:除了关联数组之外,还有一个明亮而快乐的世界。

于 2012-11-23T12:40:41.977 回答