Short answer is a link to another answer on so, but I think it'll prove useful as this is a complicated matter. what seems logical due to the way php works may not actually be how the core implementation will manage the memory.
[edit]
A simple script to illustrate the internals.
Strings are not objects in PHP - objects act totally differently than scalar variables.
If you're asking about string variables types the following script should shed some light on the internals.
<?php
header( 'content-type: text/plain' );
$a = 'a';
$b = $a;
echo '$b: '; debug_zval_dump( $b );
$b = 'b';
echo '$a: '; debug_zval_dump( $a );
echo '$a: '; debug_zval_dump( $b );
Output
$b: string(1) "a" refcount(3)
$a: string(1) "a" refcount(2)
$a: string(1) "b" refcount(2)
[edit] - another illustration with memory usage
<?php
header( 'content-type: text/plain' );
$start = memory_get_usage();
echo 'Mem: ' . ( memory_get_usage() - $start ) . PHP_EOL; $start = memory_get_usage();
$a = 'a';
echo 'Mem: ' . ( memory_get_usage() - $start ) . PHP_EOL; $start = memory_get_usage();
$b = $a;
echo 'Mem: ' . ( memory_get_usage() - $start ) . PHP_EOL; $start = memory_get_usage();
echo '$b: '; debug_zval_dump( $b );
$b = 'b';
echo 'Mem: ' . ( memory_get_usage() - $start ) . PHP_EOL; $start = memory_get_usage();
echo '$a: '; debug_zval_dump( $a );
echo 'Mem: ' . ( memory_get_usage() - $start ) . PHP_EOL; $start = memory_get_usage();
echo '$a: '; debug_zval_dump( $b );
echo 'Mem: ' . ( memory_get_usage() - $start ) . PHP_EOL; $start = memory_get_usage();
Output
Mem: 76
Mem: 88
Mem: 48
$b: string(1) "a" refcount(3)
Mem: 40
$a: string(1) "a" refcount(2)
Mem: 0
$a: string(1) "b" refcount(2)
Mem: 0