On Wed, Jan 19, 2011 at 2:07 AM, Larry Garfield <la...@garfieldtech.com>wrote:

> 3) Static analysis.  Instead of reflection, either tokenize or string parse
> all files to determine what classes implement what interfaces and then
> cache
> that information.  We are actually using this method now to locate classes,
> and it works surprisingly well.  Because we never parse code into memory it
> does not ever spike the memory usage.  However, it is impossible to
> determine
> if a class implements a given interface by static analysis unless it
> declare
> so itself with the implements keyword.  If it does so indirectly via
> inheritance, either via the class or via the interface, it would not find
> it.
> That necessitates that any "detectable" classes must explicitly themselves
> declare their interfaces, even if it is redundant to do so.  I don't like
> that
> approach, but it's the first one that strikes me as even viable.
>

4) Explicit declaration.  In this approach we detect nothing and rely on the
> plugin developer to do everything.  That is, they must provide somewhere
> (either in code or a configuration file) an index of all classes they
> offer,
> the interfaces they implement, and the file in which they live.  While this
> makes the implementation easy, it is a huge burden on the plugin developer
> and
> I'm quite sure they'll forget to do so or get it wrong on a regular basis.
>

I'd suggest combining 3 and 4.  Build a tool that performs a static analysis
of a group of files and make it easy for developers to use.  This tool would
generate the explicit declarations your codebase would utilize when
answering such questions as "which classes implement interface foo".  The
file the static analysis tool generates could be easily hand editable, so
developers could tweak it if they see issues (just in case the static
analysis tool has bugs early on), or for small plugins, just quick crank out
a couple lines by hand.

As long as the static analysis tool builds a composite of class hierarchy
established in all the files (project wide, at least in terms of the
plugin), you wouldn't have to double declare interfaces so they could be
detected.

Adam

-- 
Nephtali:  A simple, flexible, fast, and security-focused PHP framework
http://nephtaliproject.com

Reply via email to