函数参数的PHP多维数组类型提示


PHP multidimensional array type hinting for function parameter

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

当然,您可以键入提示单个数组,如下所示:

function Example(array $parameter) {}

但是,如果一个函数需要参数是一个多维数组,有什么方法可以通过类型提示来强制执行吗?

如果您所说的DoubleArray仅指Doubles(Floats)数组。然后,您可能想要使用自定义类来伪造它。请考虑下面的代码。请注意,初始数组包含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)