Simple router in PHP
set public $routes to private or protected if its jsut an internal resource of this class. Just use public if other classes/code explicitly should call the mothod/property
method_exists doesn't check if the method is callable. But that might be important if you execute legacy code
Avoid echo 'some text' Better use exceptions and an exception handler
If you use if (){} else{} you could think about using the if for the termination condition and the function continues regulary if its ok
Your note about the dependency injection cache is good. Keep your idea. You are on the rigth way.
I would recommend to use doc-blocks as annotation and for IDE autocompletion for all public functions as well as class properties. This will increase the readability 
You didn't said which version of PHP you are using. Switch to >= 7.1 because 7.0 will reach its end of life soon. So you should use return types and type hinting