¿Por qué los archivos PHP deben almacenarse en la carpeta htdocs? ¿Hay alguna restricción al respecto? Podemos almacenarlos en cualquier lugar del ordenador y acceder a ellos?

Depende de la configuración del servidor. Todos los servidores (Apache2, Nginx, Lighttpd) vienen con un directorio document_root por defecto para mostrarte algo en la primera petición. Esta es una forma de ver que el servidor web funciona.

Después de la instalación puedes añadir hosts virtuales en tu servidor y mantener tus proyectos bajo el directorio que quieras. Puedes dejarlos en /var/www/htdocs o puedes crear otro directorio que sea más accesible para ti. Por ejemplo, yo guardo los proyectos en el directorio /home/web. Cada proyecto tiene su propia estructura de directorios, pero es la misma para cada proyecto. Yo suelo trabajar con el framework Symfony y tengo el directorio web dentro del proyecto que será público. Por ejemplo tendré la ruta a document_root así: /home/web/www.example.com/web (web es el directorio público por defecto en el framework symfony, puedes renombrarlo como quieras)

En /home/web/www.example.com tengo todo lo relacionado con el proyecto en sí: directorio src/ con el código fuente relacionado con el proyecto, directorio vendor/ que contiene las aplicaciones 3p que se necesitan para mi proyecto, tests/, app/ que es el lugar de configuración de mi aplicación.

Como puedes ver, todos los archivos php, archivos fuente están dentro de este directorio y no son públicos accesibles por el servidor web. Hay una razón de seguridad por la que hacer esto.

En el directorio /home/web/www.example.com/web/ sólo tengo un archivo php: index.php. Este es el único y principal punto de entrada a la aplicación. Es como la única puerta de una casa. Esta es la única manera de acceder a ella. Todos los demás archivos fuente o de configuración están ocultos y no están disponibles.

Tener varios archivos php públicos aumentará tus posibilidades de ser hackeado o de tener serios problemas en tu aplicación.

Puedes probar lo que he dicho con este repositorio VM kisphp/symfony-vagrant Está hecho para un solo proyecto por servidor. puedes añadir tantos como quieras, puedes usar Apache2 o Nginx.