【问题标题】:php arrays with only one type只有一种类型的php数组
【发布时间】:2009-07-20 11:42:32
【问题描述】:

我希望创建一个包含某种类型元素的数组或列表(例如,实现某个接口的对象)。我知道我可以创建一个对象来实现 Traversable 和 Iterator,或者覆盖 ArrayObject。但也许我错过了另一种方式。

【问题讨论】:

  • 请详细说明。你的背景是 Java 吗?
  • 我的错,这些对象确实存在于 PHP 中。
  • 我认为没有比你已经提到的更好的方法了。

标签: php arrays


【解决方案1】:

你的意思是这样的:

$array=Array();
foreach ($itemsToAdd as $item) {
    if ($item instanceof NameOfwantedInterface) {
     Array_push($array,$item);
    }
}

如果你不这样做,我很抱歉 - 只是你的问题不太清楚。

【讨论】:

  • 是的,这就是我要在合同中执行的想法。
  • PHP 没有专门为数组分配类型。使用类似这样的功能手动检查这一点。
【解决方案2】:

如果你试图分配一个不正确类型的变量,我会编写一个扩展 ArrayObject 的自定义类并引发异常,我真的没有更好的方法来做到这一点。

【讨论】:

    【解决方案3】:

    PHP 作为一种语言在类型处理和类型转换方面非常灵活。如果您想要进行任何类型的强类型检查,您可能必须进行手动检查,一个简单的 if 语句就可以了。

    数组对象被设计得特别灵活(惰性键分配、自动递增、字符串或整数键等),因此您可能应该使用自己的自定义对象。

    【讨论】:

      【解决方案4】:

      你可以使用类型提示:

      <?php
      
      interface Shape
      {
          function draw();
      }
      
      class MyArray
      {
          private $array = array();
      
          function addValue(Shape $shape) //The hinting happens here
          {
              $array[] = $shape;
          }
      }
      
      ?>
      

      这个例子并不完美,但你会明白的。

      【讨论】:

        【解决方案5】:

        基本上,你会想要做一个函数来检查你插入到数组中的变量是否是一个对象。

        function add($var)
        {
            if(is_object($var))
            {
               $this->array[] = $var;
            }
        }
        

        如果你想确保它有一个特定的类名,你可以这样做(对于 PHP5):

        function add(className $var)
        {
           $this->array[] = $var;
        }
        

        或者对于以前的 PHP 版本:

        function add($var)
        {
            if($var instanceOf className)
             {
                $this->array[] = $var
             }
        }
        

        您可能想查看array_filter() 以在不构建对象的情况下执行此操作。

        查看该页面,我发现您可以将array_filter 与is_object 等常用函数一起使用。所以做这样的事情:

        $this->array = array_filter($this->array ,'is_object');
        

        将过滤数组以仅包含对象。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-14
          • 1970-01-01
          • 2018-04-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多