> -----Original Message-----
> From: [email protected] [mailto:[email protected]]
> Sent: Wednesday, January 19, 2011 2:21 PM
> To: [email protected]
> Subject: Re: [PHP] Class and interface location
>
> On 1/19/11 3:44 PM, David Harkness wrote:
> > What about creating your own docblock tag such as @plugin-interface?
> > While it still requires each plugin to explicitly define the
> > interface(s) it implements, it won't be in the class declaration. This
> > would be very easy to nab for a tree of files using grep, removing the
> > need to do any static analysis or parse PHP code.
> >
> > David
>
> I'm not sure I see the advantage of that over specifying the interface in
the
> code:
>
> /**
> * Bob does stuff.
> *
> * @implements Foo
> */
> class Bob implements Foo {
>
> }
>
> Either way developers need to explicitly define which interfaces (of those
> we care about) the class implements, and we'll have to string parse the
file
> to find the string "Foo". As far as I know the extra implements in the
class
> declaration doesn't hurt PHP, it's just redundant.
>
> 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:
interface IDatabase
{
function connect();
function close();
function query();
// etc....
}
class MySQLDatabase implements IDatabase
{
function connect() { }
function close() { }
function query() { }
// other interface methods
function nonInterfaceMethod() { }
}
class PostgresDatabase implements IDatabase
{
function connect() { }
function close() { }
function query() { }
// other interface methods
function nonInterfaceMethod() { }
}
class MyObjectMapper extends MySQLDatabase
{
function getAll() { }
function edit() {}
// etc...
}
class Process
{
function _init(IDatabase $db)
{
$db->connect();
$db->query();
$db->close();
}
function exec() { }
// etc...
}
class PhonyObject
{
// miscellaneous methods even if the methods match exactly as the
IDatabase
}
$mdb = new MySQLDatabase();
$pdb = new PostgresDatabase();
$mom = new MyObjectMapper();
$phony = new PhonyObject();
$p = new Process();
$p->_init($mdb); // works
$p->_init($pdb); // works
$p->_init($mom); // works
$p->_init($phony); // fatal error
Hence the `I` in the API. The interface prevents from app breakage because
all classes must have matching method name(s) and the respective function
call parameters. Though, because PHP isn't a strong typed language like
C/C++/C#, Java, etc... the return value type, if any, _may_ break the app
;)
Regards,
Tommy
PS: outlook may wrap the lines... it happened once/twice before.
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php