I still don't understand why the problem is signature and moving a simple throw statement to return type, and then rewriting the catch statement to oneline-r.
I am completely satisfied with the php way of working with method signatures except non-critical cases: - still no `undefined` type, so some functions have limited functionality with func_num_args() inside - no languages still implement emptiness check on argument types. empty string should always be additionally asserted, like positive-negative numbers, and nan/inf with float stuff (nan/inf is too rarely case) - I'd say generics support but it is fully covered with phpdoc. use argument Generic, mark it as class-string and @template and it works well Try/catch statements don't scare me. I feel the trouble in missing try/catch statements and requirements to check all method call places once you throw a non-critical error just because another way, sorry, necessary way, is too hard for fast implementation. That trouble arrives only when you move from single-task script to multi-task script. The nearest example is SQL, which always works with rows and never returns one value, response is always "list of rows". So the primary method of error handling should be focused on batch processing, but `throw` keyword is very handy for filters, assertions, validators and low level static functions. If you finish your code fully covered with exceptions - once you try to run several times the same with try/catch over method calls - the original action code could have been better by catching some exceptions on its own. However, it is closed to you and now if you want to break it into two parts, you will have to rewrite it completely, because it is completely closed to you and the slightest exception that was not caught in itself (and not in you) will break it entirely, and will not disable part of it. The exception was invented in order to shift the closure of the problem to the next level of developers. However, it is the exception that prevents these developers from changing the source logic of the code that throws it and continuing to perform the action intended in the source code - the exception simply breaks the entire branch (following `encapsulation`). This means it should break only the most primitive functions that can be replaced quickly. This is where the so-called SOLID came from, which forces everything to be broken down into molecules instead of first closing the problem and then deciding whether to break it into parts or leave it that way.