On Wed, 2007-10-10 at 17:46 -0400, Nathan Nobbe wrote: > On 10/10/07, Robert Cummings <[EMAIL PROTECTED]> wrote: > On Wed, 2007-10-10 at 13:30 -0500, Jay Blanchard wrote: > > [snip] > > so what are the benefits of the "with interfaces" solution > over > > the"without > > > interfaces" solution > > [/snip] > > > > Polymorphism. > > Bleh, polymorphism isn't unique to interfaces. In fact, PHP > has > polymorphism all over the place by virtue of it's loose type > system. I > can pass ANY object to any function or method (that doesn't > use PHP5's > restrictive type hinting stuff) and the code will "just use > it" as long > as the appropriate member functions/variables exist. PHP > doesn't need > inheritance or interfaces to achieve this. In fact this is far > more > flexible than the restrictive nature of interfaces. Lemme > illustrate: > > class Finger > { > function wiggle() > { > echo 'A finger wiggles ominously.'; > } > } > > class Earthworm > { > function wiggle() > { > echo 'An earthworm wiggles around.'; > } > } > > function wiggle( $something ) > { > if( method_exists( $something, 'wiggle' ) ) > { > $something->wiggle(); > } > else > { > echo 'Nothing happens.'; > } > } > > $finger = new Finger(); > $jim = new Earthworm(); > > wiggle( $finger ); > wiggle( $jim ); > > Look Ma, no inheritance, no interfaces, and we have > polymorphism. in > fact, our wiggle function can take absolutely anything and > just try to > wiggle it. Undoubtedly OOP purists are going to scream at this > because > it just feels wrong, *hah*, too bad :) > > > another interesting code example, but the use of method_exists is in > userspace and > would have to be called everywhere you wanted to use the 'wiggleable' > interface. > > could you imagine using interfaces with multiple methods and multiple > parameters w/ > this technique; i think it would get rather messy. > > interface A { > function a($someVar); > function b($someOtherVar, $anotherOtherVar); > function c($someStupidVar) > } > > very easily identified by A. > > vs. > > function doSomethingWithA($classInstance) { > if(method_exists($classInstance, 'a') && > method_exists($classInstance, 'b') && > method_exists($classInstance, 'c')) { > $classInstance->a('a'); > $classInstance->b('b', 'c'); > $classInstance->c('c'); > } > } > > and we dont have the ability to count the number of parameters in each method > without using reflection or going into some unorthodox technique; more > specifically, > php doesnt provide a function similar to func_num_args() for class methods. > at > least i didnt see one here. > so identifying one method, no parameter interfaces would work with this > technique. > it doesnt do well for moderately complex interfaces which ill define as any > interface > with more than one method where those methods have 1 or more parameters. yes, > code using this technique would be quite ugly for such interfaces. > > another benefit of going w/ the language constructs is the existence of the > interfaces, or > other classes that would be used polymorphically is that they are defined > outside of the > code that uses them. thats a little cleaner. > i hate digging through code where some functionality is in one place and then > mysteriously > its in another; and then a light turns on and i realize its the same > functionality in two different > places w/o a label to let me know w/o thinking they are the same. > this example is a little better than that, but still not as nice as the > language keywords. > > there is a new art that php exposes; one that mingles functions and objects > without > requiring objects. functions are not first class citizens but they have a > global visibility. > one interesting argument is that in java static methods are essentially a way > (the only way) > to provide a global method call. in php that isnt necessary, a function > could just be written. > but i still like the static class method; because there is the association of > the function w/ > some other functions that belong to the class; there is encapsulation. > > this example is cool because it illustrates some of the neat things that can > be done w/ phps > mix of objects and functions.
What I was really illustrating is how interfaces are syntactic sugar only. In my above example what I've really shown is an implicit interface :) Since OOP is largely meant to model real world things, ask yourself this... when a doctor sews a pig's heart into a human, do you think there's an explicit interface someplace that checks for compatibility, or does it "just work" if the conditions are right. Food for thought, pork in fact ;) Cheers, Rob. -- ........................................................... SwarmBuy.com - http://www.swarmbuy.com Leveraging the buying power of the masses! ........................................................... -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php