While a program's running, PHP maintains a big table of all the variables curently defined. Each record in this table contains things like the name of the variable and what type of variable it is. Most significantly is a field that contains a (C-like) pointer to a certain location in memory where the value of the variable is to be found.
When you say "$foo=$bar;", the value of $bar is copied to a new location in memory and $foo points to the new location. When you say "$foo=&$bar;" $foo is set t point to the same memory location that $bar does, so that changing the value of $foo or $bar changes the value of $bar or $foo at the same time.
That's only a first approximation: there are all sorts of memory management optimisation fun and games involving reference counts and copy-on-write and so on, but conceptually that's enough to be going on with.