> this does beg the question why don't you know the classname at runtime.. 
> seems to be a slight design flaw and may make sense for you to post the 
> full problem (you must have chosen to implement this for a reason..)

The full problem is: I started off with a "DeployTask" for deploying a
new instance of my web project to DreamHost:
http://cgi.sfu.ca/~jdbates/tmp/php/200812170/DeployTask.class.phps

(It is a "task" in the symfony framework, but basically the
DeployTask::execute() method gets called)

The task takes about thirty minutes to run, so I broke it up into steps.
After each step, it updates a database row so that a user who started
the task through a web interface can monitor its progress.

Great so far. Now I decided to create an "UpdateTask" for updating
deployed instances to the latest version of my code:
http://cgi.sfu.ca/~jdbates/tmp/php/200812170/UpdateTask.class.phps

Of course it also takes a long time to run, so my first iteration just
extends the DeployTask and defines different steps. UpdateTask inherits
DeployTask::execute(), which drives the steps and updates the database.

Unfortunately, in the inherited DeployTask::execute(), "self::$STEPS"
does not refer to UpdateTask::$STEPS, it refers to DeployTask::$STEPS
: (

I gather with "late static bindings" in PHP 5.3, "static::$STEPS" does
what I want? Anyway, DeployTask::execute() is not static, so I know
whether $this is an instance of DeployTask of UpdateTask:
"get_class($this)" returns it. Which brought me to my contrived example:

ket% cat test.php 
<?php

class Test
{
  public static
    $STEPS = array(
      'foo',
      'bar');
}

$className = 'Test';

var_dump($className::$STEPS);
ket% 

Except that in real life, "$className = get_class($this)"

> Check this out:
> http://us2.php.net/manual/en/language.oop5.static.php
> 
> It actually won't work until 5.3.0 when they add late static binding.

I ran my contrived example with PHP 5.3alpha3, and it worked!
"$className::$STEPS" is not a parse error in 5.3, which is cool : )

Except that in 5.3, I will probably just use "static::$STEPS" anyway : P

In the meantime, I will probably use reflection as suggested:

    // HACK: Use "static::$STEPS" in PHP 5.3:
    // http://php.net/oop5.late-static-bindings
    $class = new ReflectionClass($this);
    $steps = $class->getStaticPropertyValue('STEPS');


-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to