RE: [PHP] PHP5 objects access/instantiation model (correction)
| From: | Steve Perkins | Date: | Wed, 11 Jul 2007 21:01:14 +0000 |
| Subject: | RE: [PHP] PHP5 objects access/instantiation model (correction) | ||
| References: | 1 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-258644@lists.php.net to get a copy of this message | ||
Yeah. I've been working on re-writing it using bits from everyone !! It's a
good learning process to find out how PHP handles OOP. I thoroughly
recommend it, it's the only way to learn. Some things just can't be learnt
from the manual!
Cheers All.
-----Original Message-----
From: Richard Lynch [mailto:ceo@l-i-e.com]
Sent: 11 July 2007 21:29
To: Steve Perkins
Cc: php-general@lists.php.net
Subject: Re: [PHP] PHP5 objects access/instantiation model (correction)
You probably ought to have:
class mysql_driver extends generic_driver { }
Seems like that would be the most reasonable OOP model, imho.
That said, I suspect that if you do something like:
$driver = $this->driver;
You then may be able to access the driver-specific data using
$driver->propl; etc.
On Wed, July 11, 2007 10:46 am, Steve Perkins wrote:
> OK, so that came out fairly illegible. Try again:
>
> Hi, new to PHP5 (and the forums evidently !) and I have a question
> about the object model.
>
> I want to be able to create a class which is allows abstraction from
> specifics. So for one example, imagine a generic database connection
> wrapper which can have multiple drivers depending on the database
> used. Some of the functionality is generic, some is database specific
> (mysql_ , odbc_).
> So:
>
> Class MySQL_driver {
> public prop1 ;
> public connect() {
> echo "Foo";
> }
> public runquery() {
> echo "Foo";
> }
> ...
> }
>
> Class ODBC_driver {
> public prop1 ;
> public connect() {
> echo "Foo";
> }
> public runquery() {
> echo "Foo";
> }
> ...
> }
>
> Class generic {
> public $driver = null ;
> function __construct($connection_type) {
> if $this->connection_type = "MySQL" {
> $this->driver = new MySQL_Driver ;
> } else {
> $this->driver = new ODBC_Driver ;
> }
> }
>
> // Using the non-generic connect() from the selected driver
>
> function authenticate {
> $this->driver->prop1 = "fooey"
>
> // These references work fine from within
> // the generic class
>
> echo $this->driver->prop1 ;
> echo $this->driver->function1 ;
> }
>
> // Report non-generic errors from the selected driver
>
> function errors {
> }
> function debug {
> }
>
> ...
>
> }
>
> $gen = new generic("MySQL") ;
>
> // Instantiate the generic database object, which // determines its
> own driver
>
> $gen->driver->prop1 = "fooey"
>
> // but they fail from here
>
> echo $gen->driver->prop1 ;
> echo $gen->driver->function1 ;
>
> // this works ok though, so everything is created // correctly
>
> $gen->authenticate() ;
>
>
> So I want to access generic functions as $generic->authenticate(), and
> database specific functions $generic->driver->runquery. This allows
> the top level code to be able to be completely generic and not know
> anything about the underlying database.
>
> But I can't ! I can't find a way of accessing the encapsulated object
> (driver) from the instantiator of generic. Is it possible ?
>
> I guess there are lots of "workaround" ways. I could write lots of
> "middleman" code in generic and use things like __set and __get etc
> but its lots of extra overhead. I also know I could use extends but
> that makes the code the wrong way around (MySQL_Driver would have to
> extend generic), hence the top-level application would have to include
> code to determine which driver to create rather than the db object
> determining its own connection driver to use. This is true also for
> just lumping everything in a single class per db type.
>
> Surely it must be possible ? Or am I missing something ?
>
> I also don't really get the idea of interface and abstract classes ?
> They
> don't seem to be any practical use ? Maybe that's me ? Anyway, not
> really relevant to this post ...
>
> Please, please can someone help !!
>
> Thanks
>
> --
> PHP General Mailing List (http://www.php.net/) To unsubscribe, visit:
> http://www.php.net/unsub.php
>
> --
> PHP General Mailing List (http://www.php.net/) To unsubscribe, visit:
> http://www.php.net/unsub.php
>
>
--
Some people have a "gift" link here.
Know what I want?
I want you to buy a CD from some indie artist.
http://cdbaby.com/browse/from/lynch
Yeah, I get a buck. So?
--
PHP General Mailing List (http://www.php.net/) To unsubscribe, visit:
http://www.php.net/unsub.php