我正在攻读Php的学校作业。我已经到了一个点,我想在一个对象中存储一组对象(同一类的所有实例)然后返回。目前我使用数组,但这对我来说有一些缺点。
我知道在C#和Java中有特定的类和接口,例如List
,Dictionary
和Map
。
有没有办法在Php中创建类似的行为,通过编写类或扩展现有类? (最重要的方面是检查/强制添加元素的类型)
我想要的是什么:
$collection = Series::getAll(); // Returns a Collection<Series>, currently returns an array
echo $collection->toJson(); // This is currently not possible, because it's an array
$anotherCollection = new Collection<Movie>(); // I realize Php doesn't support this syntax, but I want this behavior, the syntax can be different for all I care
答案 0 :(得分:2)
虽然任何对象都可以用于类型提示,但PHP提供了一些基类,它们可以扩展以满足您的需求,例如ArrayObject
:http://php.net/arrayobject
更新:用法示例
class A{}
class B{}
class CustomList extends ArrayObject{
protected $validType = 'A';
public function offsetSet($index, $val) {
if(! $val instanceof $this->validType) {
throw new \Exception('Cannot add item object of class '.get_class($val));
}
return parent::offsetSet($index, $val);
}
}
$list = new CustomList();
$a = new A();
$b = new B();
$list[] = $a; // this one is ok
$list[] = $b; // fails - throws exception
可以在外部设置validType
属性(使其成为公共或使用setter方法),或者扩展类并覆盖子实例中的属性。
答案 1 :(得分:1)
是的,正如你所说,有一种方法;通过写一个简单的类。你需要使用类型提示:
http://www.php.net/manual/en/language.oop5.typehinting.php
许多框架/库已经有了自己的解决方案,可能值得一试:
http://www.doctrine-project.org/api/common/2.3/class-Doctrine.Common.Collections.ArrayCollection.html https://github.com/propelorm/Propel/blob/master/runtime/lib/collection/PropelCollection.php