Re: class object vs array for db table model

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



hehe that's pretty funny; also funny oversight of mine in regards to
isset()... so I guess we're both comedians today?  ;-)

Glad you got that worked out Tommy!

Chris.


On Tue, Oct 12, 2010 at 8:46 AM, Tommy Pham <tommyhp2@xxxxxxxxx> wrote:

> On Tue, Oct 12, 2010 at 4:45 AM, chris h <chris404@xxxxxxxxx> wrote:
> >
>
> <snip>
>
> >
> >
> > When you are adding a row as an object you are calling 4 user
> > functions: MyTable::__construct(), MyTable::setId(), MyTable::setName(),
> and
> > MyTable::setDescription().  This adds some overhead for sure, so you
> might
> > want to think about passing the row array into the construct and doing
> away
> > with the setters (at least for the initial instantiations).
> > Something like this...
> > -----
> > public  function __construct($dataArray=null)
> > {
> >   foreach ((array)$dataArray as $rowKey => $rowValue)
> >   {
> >     $this->$rowKey = $rowValue;
> >   }
> > }
> > ==OR==
> > public  function __construct($dataArray=null)
> > {
> >   // maybe add casting here as well?
> >   $this->_id              = isset($dataArray['id'])?
> >   $dataArray['id']: null;
> >   $this->_name         = isset($dataArray['name'])?
> > $dataArray['name']: null;
> >   $this->_description  = isset($dataArray['description'])?
> >  $dataArray['description']: null;
> > }
> > ==And instantiate like this==
> > $list = array();
> > while ($row = $db->fetch($result))
> > {
> >   // I also changed setting the $list's key with "$row['id']" instead of
> > using the MyTable getter.
> >   $list[$row['id']] = new MyTable($row);
> > }
> > ---
> > I don't know how much faster that will run for you (if at all) but using
> > your method you were calling 5 user functions per result set from the db
> > (that's the construct, the getter to set the $list key, and 1 for each of
> > the 3 properties of the result) for a total of 18,420 user function
> calls.
> >  With my method I'm calling 1 user function (the construct) for each set,
> > for a total of 3,684 calls.  Of course a down-side is that if there's any
> > logic in your setters then that needs to be replicated in your construct.
> > Another method is to use a single object for all 3684 records.  Perhaps
> you
> > can use the built in Iterator interface which lets your class's objects
> be
> > used as if they were an array for the purposes of foreach loops.
> > http://php.net/manual/en/language.oop5.iterations.php
> > You would set a pointer to the record you wish to use, and your getters
> and
> > setters would key off that element of the master array.  This should be a
> > fast solution, while still giving you the power of encapsulation, getters
> > and setters.
> >
> > Hope that helps!
> > Chris.
> >
>
> Hi Chris,
>
> Thanks for the reply.  The sample I made is just for simplicity and
> comparison.  As for function calling 'get's, I think the speed would
> come out to be same in your sample since you're doing isset()
> checking.  My actual class is more sophisticated having the psuedo
> overloading as you mentioned.  The class is generated from a PHP class
> builder - to save on typing - I made a long time ago with some minor
> update.
>
> Anyway, I was frustrated as to why my code took so long to execute and
> had to dig deep.  As it turns out, I had xdebug loaded with all
> options on ... lol.  Removed the extension and all is good in the
> world.  The script runs in less than 150ms :D!!!
>
> Thanks,
> Tommy
>
> PS:  This is what I get for not coding in PHP so long ...
>

[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux