TalkPHP

TalkPHP (http://www.talkphp.com/forums.php)
-   Advanced PHP Programming (http://www.talkphp.com/advanced-php-programming/)
-   -   Assigning non-static properties from a static method? (http://www.talkphp.com/advanced-php-programming/3093-assigning-non-static-properties-static-method.html)

delayedinsanity 07-10-2008 04:00 AM

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

sketchMedia 07-10-2008 09:59 AM

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?

delayedinsanity 07-10-2008 02:19 PM

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 07-10-2008 02:30 PM

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

sketchMedia 07-10-2008 02:49 PM

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.


All times are GMT. The time now is 02:12 PM.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.1.0