As you mentioned the problem is the following line:
$instance = self::$registry[$className]['resolve']();
PHP tries to call a function with the name of the string value from the $registry array (not the static class property!). While only a static::$registry array exists, and no local $registry array, php prints the undefined notice.
Because of the function call, PHP resolves this statements like the following pseudo code:
$string = $registry[$className]['resolve'];
$result = $string();
$instance = self::{result of function call};
That also is the reason your solution worked. Maybe a static getter method can encapsulate the array acces logic.
There is also a bug filed for this behaviour: https://bugs.php.net/bug.php?id=55573 and an explanation that this is expected to work like it does.