php uses reference counting and copy-on-write to manage memory. Reference evaluation ensures that memory is returned to the operating system when the reference is no longer needed, and copy-on-write ensures that memory is not wasted when values are copied between variables.
To understand memory management in PHP, you must first understand the idea of a symbol table. A variable has two parts - the variable name (such as $name) and the variable value (such as "Fred"). A symbol table is an array that maps variable names to the memory locations of their values.
When copying a value from one variable to another, PHP does not get more memory by copying the value, but updates the symbol table to indicate that "these two variables are the names of the same memory". So the following code doesn't actually create a new array:
$people = array("Gonn",25,"Zeng"); $programmer = $people; //数组没有被复制
If you modify any copy, PHP will allocate memory and generate the copy:
$people[1] = 26; //数组被复制,值发生变化
PHP saves time and memory in many cases due to delayed allocation and copying. This is copy-on-write.
Each value pointed to by the symbol table has a reference count, which is a number that represents the number of paths leading to that piece of memory. After assigning the initial value of the array to $people and assigning $people to $programmer, the entries in the symbol table pointing to the array are $people and $programmer, and the reference count is 2. In other words, there are two ways to reach that memory: through $people or $programmer. But after $people[1] changes, PHP creates a new array for $people, and the reference count of each array is only 1.
When a variable is out of scope (function parameters or local variables are at the end of the function), the reference count is decremented by 1. When a variable is allocated a value in another area of memory, the old reference count is decremented by one. When the reference count reaches 0, the memory is released. This is reference counting.
The preferred method of managing memory using reference counting, maintains the function locality of variables to pass the values needed by the function, and lets the reference counting be responsible for releasing the memory when the reference is no longer needed. If you want to get more information or have complete control over the value of the released variable, you can use the functions isset() and unset().
To see if the variable has been set (even if it is an empty string), use isset():
$s1 = isset($name); //$s1为false $name = "Gonn"; $s2 = isset($name); //$s2为true
Use unset() to delete the value of a variable:
$name = "Gonn"; unset($name); //$name为NULL
Extended reading: http://php.net/manual/zh/features.gc.refcounting-basics.php