Iterable objects and array type hinting?

前端 未结 6 1578
遇见更好的自我
遇见更好的自我 2020-11-30 03:28

I have a lot of functions that either have type hinting for arrays or use is_array() to check the array-ness of a variable.

Now I\'m starting to use ob

6条回答
  •  隐瞒了意图╮
    2020-11-30 04:13

    I use a simple (and maybe a little hackish) way to test for "iterability".

    function is_iterable($var) {
        set_error_handler(function ($errno, $errstr, $errfile, $errline, array $errcontext)
        {
            throw new \ErrorException($errstr, null, $errno, $errfile, $errline);
        });
    
        try {
            foreach ($var as $v) {
                break;
            }
        } catch (\ErrorException $e) {
            restore_error_handler();
            return false;
        }
        restore_error_handler();
        return true;
    }
    

    When you try to loop a non iterable variable, PHP throws a warning. By setting a custom error handler prior the attempt to iterate, you can transform an error into an exception thus enabling you to use a try/catch block. Afterwards you restore the previous error handler to not disrupt the program flow.

    Here's a small test case (tested in PHP 5.3.15):

    class Foo {
        public $a = 'one';
        public $b = 'two';
    }
    
    $foo = new Foo();
    $bar = array('d','e','f');
    $baz = 'string';
    $bazinga = 1;
    $boo = new StdClass();    
    
    var_dump(is_iterable($foo)); //boolean true
    var_dump(is_iterable($bar)); //boolean true
    var_dump(is_iterable($baz)); //boolean false
    var_dump(is_iterable($bazinga)); //bolean false
    var_dump(is_iterable($boo)); //bolean true
    

提交回复
热议问题