【问题标题】:PHP multidimensional array type hinting for function parameter函数参数的 PHP 多维数组类型提示
【发布时间】:2016-11-29 03:38:26
【问题描述】:

在 PHP 中,是否可以键入提示多维数组作为函数参数?

当然,您可以像这样键入提示单个数组:

function Example(array $parameter) {}

但是如果一个函数需要参数是一个多维数组,有没有办法通过类型提示来强制执行呢?

【问题讨论】:

  • PHP 的类型不如 Java 或 C# 强。这就是为什么你在 PHP 中甚至有像 mixed 这样的概念。因此,PHP 不关心您的数组是否必须只包含双精度或字符串或mixed,但如果您需要该功能,也许您可​​以自己实现检查。伪造它的一种方法是创建一个类:DoubleArray 也许然后将其用于类型提示...
  • 双倍是指多维还是双倍(浮点数)?
  • @AbraCadaver 多维数组,对不起,我会更新问题以明确说明

标签: php arrays multidimensional-array type-hinting


【解决方案1】:

如果DoubleArray 你的意思是一个双精度数组(浮点数)。然后你可能想使用自定义类来伪造它。考虑下面的代码。请注意,初始数组包含 strings,但最终结果不包含:

<?php

    class DoubleArray{
        protected $instance;
        public function __construct(array $arrDoubles) {
            foreach($arrDoubles as $key=>$double) {
                if(!is_double($double)){
                    unset($arrDoubles[$key]);
                }
            }
            $this->instance = array_values($arrDoubles);
        }

        public function push($numDouble){
            $this->instance[] = $numDouble;
        }

        public function get(){
            return $this->instance;
        }
    }

    $arr    = array(2.35, 72.9, 88.45, 42.76, "No...", 57.77,  "String is not Double");
    $da     = new DoubleArray($arr);

    var_dump(getData($da));


    function getData(DoubleArray $data){
        // ALL ARRAY FUNCTIONS STILL APPLY TO THE $doubleArray VARIABLE
        // HOWEVER TO GET THE CUSTOM DOUBLE ARRAY DATA, YOU MAY HAVE TO
        // JUST CALL THE get() METHOD ON THE DoubleArray INSTANCE: $data
        $doubleArray    = $data->get();
        return $doubleArray;
    }

    // THE var_dump(getData($da); ABOVE PRODUCES:
    array (size=5)
      0 => float 2.35
      1 => float 72.93
      2 => float 88.45
      3 => float 42.76
      4 => float 57.77
但是,如果 DoubleArray 是指 Multidimensional Arrays,您仍然可以使用自定义类来伪造它,如下所示。
<?php

    class DoubleArray{
        protected $instance;

        public function __construct(array $arrMDDoubles) {
            foreach($arrMDDoubles as $key=>$subArray) {
                if(!is_array($subArray)){
                    throw new Exception("DoubleArray accepts only Multidimensional Arrays...");
                }
            }
            $this->instance = $arrMDDoubles;
        }

        public function push($arrArray, $key=null){
            if(!is_array($arrArray)){
                throw new Exception("You can only Push an Array...");
            }
            if(!is_null($key)){
                $this->instance[$key]   = $arrArray;
            }else{
                $this->instance[]       = $arrArray;
            }
            return $this;
        }

        public function get(){
            return $this->instance;
        }
    }

    $arr    = array(array(2.35, 72.93,), array(88.45, 42.76), array("No...", 57.77,  "String is not Double"));
    $da     = new DoubleArray($arr);

    var_dump(getData($da));


    function getData(DoubleArray $data){
        // ALL ARRAY FUNCTIONS STILL APPLY TO THE $doubleArray VARIABLE
        // HOWEVER TO GET THE CUSTOM DOUBLE ARRAY DATA, YOU MAY HAVE TO
        // JUST CALL THE get() METHOD ON THE DoubleArray INSTANCE: $data
        $doubleArray    = $data->get();
        return $doubleArray;
    }

    // THIS TIME THE THE var_dump(getData($da) ABOVE WOULD THROW AN EXCEPTION
    // IF THE GIVEN ARRAY IS NOT MULTI-DIMENSIONAL BUT PRODUCE SOMETHING
    // LIKE THIS OTHERWISE:     
    array (size=3)
      0 => 
        array (size=2)
          0 => float 2.35
          1 => float 72.93
      1 => 
        array (size=2)
          0 => float 88.45
          1 => float 42.76
      2 => 
        array (size=3)
          0 => string 'No...' (length=5)
          1 => float 57.77
          2 => string 'String is not Double' (length=20)

【讨论】:

  • 好吧,我的意思是多维数组,但是我没有想到使用类来强制参数类型,谢谢!
  • multidimensional-array 标签从一开始就存在。
  • @revo 然而,即使是像 AbraCadaver 这样的大师也问:你所说的 double 是指多维还是值是 doubles(浮点数)? 你是否也让他知道,也是?
  • 我不确定您所说的 Master 是什么意思,但因为您是第一个对 doubles 发表某种声明的人,并且因为原创海报的速度不够快,无法回复您,第二个来到这个问题的人阅读了您对 doubles 的某些评论,然后为了清楚起见,没有从原始海报中找到答案。所以他怀疑并试图明确地询问它。您可能不关心问题标签,更重要的是问题的要求。通过说明当然您可以键入提示 单个数组,Poster 非常清楚他的需求。
猜你喜欢
  • 2011-09-12
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
  • 2018-05-27
  • 1970-01-01
  • 2013-03-17
  • 2019-08-30
相关资源
最近更新 更多