Why php does not complain when referencing a non existing variable?

前端 未结 2 339
迷失自我
迷失自我 2021-01-12 08:21

I was wondering why php does not complain when we reference a non existing variable (being it a plain variable or array), is this just the way it is, or there is something e

相关标签:
2条回答
  • 2021-01-12 08:59

    If memory of the PHP interpreter reference var allocation serves me right, PHP will create a null element in the hash table with a key like the one you sent and reference it. This is visible by running the following test:

    <?php
    $i = 0;
    $arr = [];
    $arrS = null;
    $v = memory_get_peak_usage();
    for ($i = 0; $i < 150; $i++) {
        $arrS = &$arr[rand()];
    }
    $v = memory_get_peak_usage() - $v;
    echo $v;
    

    Until the default heap size, PHP will return exactly an extra 0 memory used - as it is still allocating already "prepared" array items (PHP keeps a few extra hash table elements empty but allocated for performance purposes). You can see this by setting it from 0 to 16 (which is the heap size!).

    When you get over 16, PHP will have to allocate extra items, and will do so on i=17, i=18 etc..., creating null items in order to reference them.

    P.S: contrary to what people said, this does NOT throw an error, warning or notice. Recalling an empty item without reference would - referencing an inexistent item does not. Big big BIG difference.

    0 讨论(0)
  • 2021-01-12 09:12

    throws no warning about a non existing variable.

    This is how references work. $a = &$b; creates $b if it does not exist yet, "for future reference", if you will. It's the same as in parameters that are passed by reference. Maybe this looks familiar to you:

    preg_match($pattern, $string, $matches);
    

    Here the third parameter is a reference parameter, thus $matches does not have to exist at time of the method invocation, but it will be created.

    that &NULL is something I didn't really expected, I thought I would get a plain NULL.

    Why didn't you expect it? $r['er'] is a reference "to/from" $t. Note that references are not pointers, $r['er'] and $t are equal references to the same value, there is no direction from one to the other (hence the quotation marks in the last sentence).

    0 讨论(0)
提交回复
热议问题