TalkPHP
 
 
Account Login
Latest Articles
» The basic usage of PHPTAL, a XML/XHTML template library for PHP
» Vulnerable methods and the areas they are commonly trusted in.
» Simple way to protect a form from bot
» The Basics On: How Session Stealing Works
» How to keep your forms from double posting data
IRC Channel
IRC Speech Bubble Join the friendly bunch on IRC...
(#TalkPHP on Freenode)

...Also available via a web interface.

See this thread for information on the TalkPHP Free Hugs Initiative™. Subject to availability.
Associates
Associates
CSS Tutorials
Reply
 
LinkBack Thread Tools Search this Thread Display Modes
Old 07-10-2008, 04:00 AM   #1 (permalink)
is cute and cuddly
 
delayedinsanity's Avatar
 
Join Date: Mar 2008
Location: Vegas, Baby
Posts: 963
Thanks: 31
delayedinsanity is on a distinguished road
Default Assigning non-static properties from a static method?

I have an abstract factory that is built around a static method which returns the appropriate object based on the arguments I give it. There's certain properties I want to set at the same time that this object is instantiated because they are necessary to every possible child object that it may generate.

Now here's the problem. From within a static method, you can only set static properties. So I switched all my properties that I need to set from there to static, simple solution and it works just fine, but I'm curious...

...is it possible to somehow set a non-static property from within a static method?

At first it seemed easy, set the non-static property from within the constructor of the child object, but the abstract factory has a few methods which I need to use across all objects which require these properties to be set as well, so I need to set them from within the static method, not from within the child.
-m
delayedinsanity is offline  
Reply With Quote
Old 07-10-2008, 09:59 AM   #2 (permalink)
The Prestige
Advanced Programmer Top Contributor Good Samaritan 
 
sketchMedia's Avatar
 
Join Date: Oct 2007
Location: Manchester, UK
Posts: 854
Thanks: 32
sketchMedia is on a distinguished road
Default

Just have accessor methods inside your child classes:
PHP Code:
<?php
class factory
{
    private static 
$pChild;

    public static function 
getInstance($child)
    {
        if(!
self::$pChild instanceof $child
        { 
            
self::$pChild = new $child
        }

        
self::$pChild->someVar 'some value';
        return 
self::$pChild;
    }
}
class 
child
{
    private 
$someVar;

    public function 
__set($key$value)
    {
        if(
in_array($this->$keyget_class_vars(__CLASS__)))
        {
            
$this->$key $value;
        }
    }
    public function 
__get($key)
    {
        if(isset(
$this->$key))
        {
            return 
$this->$key;
        }
        return 
false
    }
}

$child factory::getInstance('child');
echo 
$child->someVar;
That the kind of thing you are after?
__________________
mysql> SELECT * FROM `users` WHERE `users`.`clue` > 0;
Empty set (0.00 sec)
sketchMedia is offline  
Reply With Quote
Old 07-10-2008, 02:19 PM   #3 (permalink)
is cute and cuddly
 
delayedinsanity's Avatar
 
Join Date: Mar 2008
Location: Vegas, Baby
Posts: 963
Thanks: 31
delayedinsanity is on a distinguished road
Default

Oy vey, why is it everytime I think I actually have an interesting question, the answer was staring me in the face the whole time? You hit the nail on the head, though I don't need to use any magic functions at all.

PHP Code:
class pointer
{

    public function 
connect ()
    {
        echo 
'connected!';
    }

}


class 
factory
{

    static public 
$inst;
    public 
$pPointer;

    static public function 
getInstance ($child)
    {
        
self::$inst = new $child;
        
self::$inst->pPointer = new pointer;
        return 
self::$inst;
    }

    protected function 
_point ()
    {
        
$this->pPointer->connect();
    }

}


class 
child extends factory
{

    public function 
works ()
    {
        
$this->_point();
    }

}

$pTester factory::getInstance('child');
$pTester->works(); 
Sometimes my own 'logic' is the most blinding. My getInstance method was doing what it was supposed to in a specific order: initialize values, determine what the factory is generating, generate new object. The static method did everything I thought it could, then pumped out the child like a baby with it's return statement. The answer was in reversing the steps... generate the object, initialize the values directly in the object, then return the object.

Okay, back to work...
-m
delayedinsanity is offline  
Reply With Quote
Old 07-10-2008, 02:30 PM   #4 (permalink)
is cute and cuddly
 
delayedinsanity's Avatar
 
Join Date: Mar 2008
Location: Vegas, Baby
Posts: 963
Thanks: 31
delayedinsanity is on a distinguished road
Default

Well, that makes me feel slightly better. I need the pointer to be staticly set before the instance of the module is created anyways, due to the fact that the modules constructors also handle the display controller, and if I try to create the object, then set the property, I'd need to go back through every module and remove the display from the construct and create a seperate method, then call that method from the... anyways, turns out it works better with the property being static anyways, though this shall be helpful for the future.
-m
delayedinsanity is offline  
Reply With Quote
Old 07-10-2008, 02:49 PM   #5 (permalink)
The Prestige
Advanced Programmer Top Contributor Good Samaritan 
 
sketchMedia's Avatar
 
Join Date: Oct 2007
Location: Manchester, UK
Posts: 854
Thanks: 32
sketchMedia is on a distinguished road
Default

Quote:
why is it everytime I think I actually have an interesting question, the answer was staring me in the face the whole time?
I know the feeling, glad it was of some use to you.
__________________
mysql> SELECT * FROM `users` WHERE `users`.`clue` > 0;
Empty set (0.00 sec)
sketchMedia is offline  
Reply With Quote
Reply



Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 
Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On


All times are GMT. The time now is 01:58 PM.

 
     

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.1.0
Inactive Reminders By Icora Web Design