Hombre, hay casos en los que se utilizan frames y casos en los que el script PHP incluye otras páginas. Lo que pasa es que, en el nevegador, en ambos casos la dirección no cambia, pero tú puedes comprobar si tienen frames examinando su código o en Firefox, pulsando con el botón derecho en un frame aparece la opción "Este marco > examinar código fuente del marco", etc.
Pongamos un ejemplo sencillo, inútil e inseguro
Código PHP:
<?php
include("cabecera.php");
include($_GET['modulo'] . ".php");
include("pie.php");
?>
Suponiendo que en cabecera.php tengamos una bonita cabecera y en pie.php un bonito pie de página, y además tenemos otros tres scripts llamados, por ejemplo, noticias.php, foros.php y albumes.php, se podrían llamar desde el navegador escribiendo:
index.php?modulo=noticias
index.php?modulo=foros
index.php?modulo=albumes
No obstante este tipo de construcciones son muy inseguras e ineficaces, a no ser que se disponga de un framework o sistema de módulos más complejo. De todos modos, hoy en día se utiliza la reescritura de URL para permitir direcciones del tipo
http://servidor/noticias/titulo-de-la-noticia donde normalmente se configura el servidor para que redirija todas las peticiones a un script (index.php, por ejemplo) y, éste, en base a la URL que el usuario ha escrito, cargará uno u otro módulo.