Re: Class not functioning

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

 



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