Q:

Crear función propia para calcular longitud

Debo crear una función que calcule la longitud de una cadena de caracteres; por ahora consigo que me devuelva la longitud, pero me muestra el siguiente fallo:
Uninitialized string offset

Este es el código, y un ejemplo:
/**
 * Devuelve la longitud de un texto pasado por parametros.
 */
function longitud($texto){
    $contador=0;
    $final=false;

    //mientras la posicion actual no sea null
    //muestra su contenido e incrementa en uno contador
    while($texto[$contador] != NULL){
        echo $texto[$contador] . "<br/>";
        ++$contador;
    }
    echo $contador;
}
longitud("Hola");

Y esto es lo que me muestra en el navegador:

¿Cómo puedo saber cuándo una posición no está definida en una colección en PHP?

A:

Como bien has determinado, el problema está en la condición de tu bucle while. La manera de controlar el acceso a un índice inexistente de un array es a través de la función isset() ya que esta, además de detectar que no sea NULL detecta que esté definida, que es por lo que te salta el notice.
function longitud($texto){
    $contador=0;
    $final=false;

    while(isset($texto[$contador])) {
        echo $contador;
        echo $texto[$contador] . "<br/>";
        ++$contador;
    }
}

longitud("Hola");

Si te das cuenta el notice te salta en la linea donde se evalúa la condición del while ya que para poder comprobar que el contenido de ese índice no es NULL estás referenciando un índice que no existe.
EDIT
Al tratarse de un bucle en el que sabemos de antemano el número de iteraciones que se van a realizar (tantas iteraciones como carácteres tenga el string) un bucle while sería innecesario, en su lugar es más sencillo usar un bucle for:
function longitud($texto){
    for($i = 0; $i < strlen($texto); $i++) {
        echo $texto[$i] . "<br/>";
    }
}

longitud("Hola");

