Re: Class not functioning (RESOLVED)

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

 



I looked into registries (singleton registries), and while I can see the
advantage they provide, most every article I read advised AGAINST using
singleton registries because it creates extra dependencies (ie. a file needs
the database class AND the registry class instead of just the database
class). The disadvantage to me about this is having to keep everything
straight; my projects as of late have been expanding rapidly and I can
barely keep track of everything. As it stands, it takes me about 30 minutes
to get back into my projects each day.

Wouter; I ended up going with the static option and it works nicely :) I am
thrilled at how it just works! Coupled with some nicely styled DIV layers
and some onclick=this.style.display='none'; to make it go away I have a
fantastic user notification system.

On Wed, Dec 16, 2009 at 3:59 AM, Wouter van Vliet / Interpotential <
public@xxxxxxxxxxxxxxxxxx> wrote:

> Allen,
>
> Before you go with my static-approach, please do consider Shawn's registry
> pattern suggestion. That's pretty sweet too ;-).
>
> A little response to your long text, before I help you fix the bug. A
> static property is basically the same as a regular property on an object.
> Only difference is that they are not reset when the class is instantiated
> into an object. They are just there.
>
> Now, about your bug. The syntax for referencing a static property is a bit
> weird - which has to do with the existence of class constants, which might
> have set you off.
>
> Notifier::notifyQueue would reference a class constant. The [] syntax is
> not valid here, since a constant is - you got it: constant. And thus cannot
> be changed.
> Notifier::$notifyQ[] = '<div> ... </div>'; references the static property.
>
> But... since notifyQ is a proptected static property, it is very unlikealy
> that you'll ever actually write Notifier::$notifyQ. You add to this queue
> from within the class itself, so therefore self::$notifyQ is a lot better.
>
> Does that answer your question?
>
> Btw; Shawn; Assuming that your Registry class holds objects, there is no
> need have the ampersand in front of the get method or $object argument.
> Objects are *always* references. And you might want to look at the __get,
> __set and __isset magic.
>
> Wouter
>
>
> 2009/12/16 Allen McCabe <allenmccabe@xxxxxxxxx>
>
> Wouter,
>>
>> Implementing your static idea was pretty easy, I was already referencing
>> Notifier with the :: operator in my other methods, however I am running into
>> trouble assigning new values to the static array.
>>
>> I am getting a "syntax error, unexpected '[' " on this line of my Notifier
>> class:
>>
>> Notifier::notifyQ[] = '<div class="'.$message;
>>
>> . . .
>>
>> Any ideas why this is causing an error?
>> (note: I did try using $this->Notifier, and it said I cannot do what-not
>> to a non-object, can't remember the exact message at the moment)
>>
>> On Tue, Dec 15, 2009 at 2:30 PM, Wouter van Vliet / Interpotential <
>> public@xxxxxxxxxxxxxxxxxx> wrote:
>>
>>> Allen,
>>>
>>> The short answer (but don't follow this):
>>> <?php
>>> class Meetgreet {
>>>   public function deleteSingle($id, $number) {
>>>       // do something
>>>       global $Notify;
>>>       $Notify->addToQ( .. );
>>>   }
>>> }
>>> ?>
>>>
>>> The long(er) answer:
>>> I assume your Notifier object functions as singleton? Ie; accross your
>>> entire application, there is only one instance of that class?
>>>
>>> Why not go-static? That is, to my experience, the sweetest way to make
>>> something globally accessible - without making something global. Like so
>>>
>>> <?php
>>> class Notifier {
>>>
>>>    protected static $queue = Array();
>>>
>>>    // make sure it can't be instantiated
>>>    private constructer __construct() {
>>>    }
>>>
>>>    public static function addToQ( $arg, $anotherArg) {
>>>        self::$queue[] = $arg.' - '.$anotherArg;
>>>    }
>>>
>>> }
>>>
>>> // and then from within any method anywhere, call
>>> Notifier::addToQ('foo', 'bar');
>>>
>>> ?>
>>>
>>> Does that work for you?
>>>
>>> Regards,
>>> Wouter
>>>
>>> (ps. call me a purist, but a function defined in a class is no longer
>>> called a function, but a *method*)
>>>
>>> 2009/12/15 Allen McCabe <allenmccabe@xxxxxxxxx>
>>>
>>>>  Hey all (and Nirmalya, thanks for the help!),
>>>>
>>>>
>>>> I have a question that I just can't seem to find via Google.
>>>>
>>>> I want to be able to add messages to a qeue whenever my classes complete
>>>> (or
>>>> fail to complete) specific functions. I think have a call within my html
>>>> to
>>>> my Notifier class to print all qeued messages (via a function 'printQ').
>>>>
>>>> How do I access a globally instantiated class from within another class?
>>>>
>>>> Example:
>>>>
>>>> <?php
>>>>
>>>> // INSTANTIATE
>>>> $Meetgreet = new Meetgreet;
>>>> $Notify = new Notifier;
>>>>
>>>> ...
>>>> ...
>>>>
>>>> $Meetgreet->deleteSingle($id, 1); // This completes a function within
>>>> Meetgreet class. That function needs to be able to use the Notifier
>>>> function
>>>> addtoQ(), how would this be accomplished?
>>>>
>>>> ?>
>>>> ...
>>>> ...
>>>>
>>>> <?php  $Notify->printQ()  ?>
>>>>
>>>> On Mon, Dec 14, 2009 at 6:07 PM, Nirmalya Lahiri
>>>> <nirmalyalahiri@xxxxxxxxx>wrote:
>>>>
>>>> > --- On Tue, 12/15/09, Allen McCabe <allenmccabe@xxxxxxxxx> wrote:
>>>> >
>>>> > > From: Allen McCabe <allenmccabe@xxxxxxxxx>
>>>> > > Subject:  Class not functioning
>>>> > > To: "phpList" <php-general@xxxxxxxxxxxxx>
>>>> > > Date: Tuesday, December 15, 2009, 6:17 AM
>>>> >  > Hey everyone, I just delved into
>>>> > > classes recently and have been having
>>>> > > moderate success so far.
>>>> > >
>>>> > > I have a puzzler though.
>>>> > >
>>>> > > I have the following class decalred and instantiated:
>>>> > >
>>>> > > class Notify {
>>>> > >  var $q = array();
>>>> > >
>>>> > >  public function addtoQ($string, $class)
>>>> > >  {
>>>> > >   $message = '<span class="'. $class .'">'.
>>>> > > $string .'</span>';
>>>> > >   $this->q[] = $message;
>>>> > >  }
>>>> > >
>>>> > >  public function printQ()
>>>> > >  {
>>>> > >   if (isset($q))
>>>> > >   {
>>>> > >    echo '<p align="center"
>>>> > > class="notification">';
>>>> > >    foreach($this->q as $msg)
>>>> > >    {
>>>> > >     echo $msg ."\n";
>>>> > >    }
>>>> > >    echo '</p>';
>>>> > >   }
>>>> > >
>>>> > >   return;
>>>> > >  }
>>>> > >
>>>> > >  function __destruct()
>>>> > >  {
>>>> > >   if (isset($q))
>>>> > >   {
>>>> > >    unset($this->q);
>>>> > >   }
>>>> > >  }
>>>> > > } // END CLASS Notify
>>>> > >
>>>> > >
>>>> > > And in my script, I call it like so:
>>>> > > $Notif = new Notify;
>>>> > >
>>>> > > I have run other statements in other classes that should be
>>>> > > adding to the $q
>>>> > > array (ie. Notify::addtoQ('ERROR! There Was An Error
>>>> > > Updating The
>>>> > > Database!', 'error');)
>>>> > >
>>>> > > However, when I try to get my webpage to display them
>>>> > > using:
>>>> > >
>>>> > > $Notify->printQ();
>>>> > >
>>>> > > it does not seem to want to loop through this array (and
>>>> > > print the
>>>> > > messages). I am getting NO error message, in fact
>>>> > > everything 'looks' fine,
>>>> > > I'm just not seeing the appropriate message.
>>>> > >
>>>> > > Any help would be appreicated!
>>>> > >
>>>> >
>>>> > Allen,
>>>> >  You have made a small typing mistake in function printQ() where you
>>>> would
>>>> > like to checked the array for its existence. By mistake you have wrote
>>>> "if
>>>> > (isset($q))". But your array variable is not an freely accessible
>>>> array,the
>>>> > array is embedded into an object. So, you have to write the like "if
>>>> > (isset($this->q))".
>>>> >
>>>> >  Another point, you can't add a message into the array by calling the
>>>> > member function addtoQ() using scope resolution operator "::". If you
>>>> really
>>>> > want to add message into the array, you have to call the member
>>>> function
>>>> > from within the object. (ie. $Notif->addtoQ('ERROR! There Was An Error
>>>> > Updating The Database!', 'error');).
>>>> >
>>>> > ---
>>>> > নির্মাল্য লাহিড়ী [Nirmalya Lahiri]
>>>> > +৯১-৯৪৩৩১১৩৫৩৬ [+91-9433113536]
>>>> >
>>>> >
>>>> >
>>>> >
>>>> >
>>>>
>>>
>>>
>>>
>>> --
>>> http://www.interpotential.com
>>> http://www.ilikealot.com
>>>
>>> Phone: +4520371433
>>>
>>
>>
>
>
> --
> http://www.interpotential.com
> http://www.ilikealot.com
>
> Phone: +4520371433
>

[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