|
I would suggest to incorporate a method that serves as a central location to instantiate exception objects - a consistent object-instantiation system, if you will. This method could go inside a class that is always required/loaded so we don't have to include another file just for this purpose. Zend_Loader, maybe? This approach allows us to add more processing/error-handling logic to the method in future that ripples across the framework:
////////////////////////////////////////////////////////////////////////// static function getException( $class, $message = 'ERROR', $code = 0, ... ) //////////////////////////////////////////////////////////////////////////
{ self::loadClass( $class );
//
// Or straight require_once for performance, but then format the class-name to instantiate...
// require_once( $class ); // return new $class( $message, $code, ... ); } ////////////////////////////////////////////////////////////////////////////////
Then, from within the code where an exception needs to be thrown, this becomes just a simple one-liner, instead of spilling require_once/etc lines of code all over the framework:
throw Zend_Loader::getException( <class>, <message>, <code>, ... );
2. On another note, how about other class-files that get included superfluously? I'm quite sure there are an awful lot of files included in the framework's classes without ever being used.
ViewRenderer.php is just an example. If we really want to reduce the number of included files to improve performance, we need to work on these ones, too. Bottom line - include files only on a need-to-use
basis and just-in-time! I, for one, don't want any files loaded that I don't want to use in my application - its just an over-head.
my2c
On 12/13/07, Shahar Evron <shahar.e-C1q0ot2/XZ0@xxxxxxxxxxxxxxxx
> wrote:
A while back ago there was an attempt to eliminate the loading of unused Exception files / classes by different ZF components. I don't know what
happened with that discussion, but I think we should do something about it.
I've made some profiling of relatively simple ZF-based app (doesn't load too many components - mostly the MVC, DB, Config, Registry etc. stuff)
and I've found some 10 calls to require_once to load an Exception class without having a single exception thrown (that I know of - unless some ZF code threw an exception and some other ZF component caught it).
10 redundant include files have quite an impact on performance, especially in places where you have no opcode cache installed.
A while back ago I changed Zend_Http_Client to require_once it's exception classes only when about to throw an exception, something like:
<?php if ($error_happened) { require_once 'Zend/Http/Client/Exception.php'; throw new Zend_Http_Client_Exception('Good news, everyone!'); } ?>
Now this might seem a bit cumbersome - but when considering the fact
that it's 1 line of code that never gets executed vs. always loading at least one aditional file (not to mention cases where you load Zend/Http/Client/Adapter/Exception.php which loads Zend/Http/Client/Exception.php which loads Zend/Http/Exception.php which
loads Zend/Exception.php - you get the point) I think it's worth it.
If nobody has a nicer solution to this overweight problem, I suggest all component maintainers will start doing the same (this is not my idea and
I know some already do so).
If you want, I can try to come up with a list of places that need to be fixed.
Better suggestions are most welcome!
Thanks,
Shahar.
--
Shahar.
|