On Wed, 2011-01-19 at 21:46 -0600, Larry Garfield wrote:
> On Wednesday, January 19, 2011 8:56:50 pm Tommy Pham wrote:
>
> > > And actually, thinking about it, I wonder if requiring the explicit
> > declaration
> > > is a good thing anyway because then it's immediately obvious and
> > > greppable what the class does. :-)
> > >
> > > --Larry Garfield
> >
> > You mean requiring explicit declaration of
> >
> > > class Bob implements Foo {
> > >
> > > }
> >
> > It's so you can guarantee your app from future breakage because the
> > interface guarantees minimum functionality and still maintain great
> > flexibility such that:
>
> Well, let me offer a more precise example of what I want to do:
>
> interface Stuff {
> function doStuff($a);
> }
>
> interface Things extends Stuff {
> function doThings($a);
> }
>
> class Bob implements Stuff {...}
>
> class Alice implements Stuff {...}
>
> class George {}
>
> class Matt implements Things {...}
>
>
> function make_stuff_happen($o) {
> foreach (class_that_implements_stuff() as $class) {
> $c = new $class();
> $c->doStuff($o);
> }
> }
>
> The above code should iterate over Bob, Alice, and Matt, but not George. The
> trick is how to implement class_that_implements_stuff() (or rather,
> class_that_implements_something('Stuff')) in a sane and performant fashion
> that supports auto-loading.
>
> If all of the above is together in a single file, it's dead simple with
> get_declared_classes() and class_implements(). However, in practice there
> could be some 200 interfaces -- with each installation having a different set
> of them -- and as many as 500 classes implementing some combination of those
> interfaces, possibly multiple on the same class -- also with each
> installation
> having a different set of them. I do not want to be forced to include all of
> those classes and interfaces on every page load when in practice only perhaps
> two dozen will be needed on a particular request. That makes
> class_that_implements_stuff() considerably tricker.
>
> That let naturally to having a cached index (in a database, in a file with a
> big lookup array, whatever) that pre-computed which class implements what
> interface and what file it lives in, so that we can easily lookup what
> classes
> we need and then let the autoloader find them. (Previous benchmarks have
> shown that an index-based autoloader is actually pretty darned fast.) That
> just makes building that index the challenge, hence this email thread.
>
> Thinking it through, however, I am now wondering if, in practice, indirect
> implementation (class Matt above) will even be that common. It may not be
> common enough to be an issue in practice, so requiring Matt to be declared as:
>
> class Matt implements Stuff, Things {...}
>
> isn't really that big of a deal and makes the indexer considerably simpler.
> We actually have one already that indexes class locations; it just doesn't
> track interfaces.
>
> I also, on further review, don't think that class-based inheritance will ever
> be an issue. The following:
>
> class Mary extends Alice {...}
>
> Would not make much sense at all because then both Mary and Alice would run,
> so Alice's code would run twice. So I may be over-complicating the situation.
>
> (For those following along at home, yes, this is essentially observer
> pattern.
> However, it's on a very large scale and the thing being observed may not
> always be an object, so the usual active registration process of
> instantiating
> both objects and telling them about each other on the off chance that they
> *may* be needed is excessively wasteful.)
>
> Does that make it clearer what I'm trying to do?
>
> --Larry Garfield
>
Maybe it's the noob in me, or the lack of smrts... but couldn't you just
add a var in the class, and set it like:
$GLOBALS['classes_that_do_things']['name'] = 'class_name';
And for those that do 'things', and then do the foreach on that?
foreach($GLOBALS['classes_that_do_things']['name'] as $class_name) {...}
not sure if that would work or not, it was just something that was in
the cobwebs of my brain this morning.
Steve
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php