特定类型的Php列表

时间:2014-01-15 16:23:46

标签: php arrays

我正在攻读Php的学校作业。我已经到了一个点,我想在一个对象中存储一组对象(同一类的所有实例)然后返回。目前我使用数组,但这对我来说有一些缺点。

  • 阵列没有也不支持OO方法
  • 数组不检查或强制添加到它们的变量类型

我知道在C#和Java中有特定的类和接口,例如ListDictionaryMap

有没有办法在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

2 个答案:

答案 0 :(得分:2)

虽然任何对象都可以用于类型提示,但PHP提供了一些基类,它们可以扩展以满足您的需求,例如ArrayObjecthttp://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