Hi Robin,

Thank you for catching this issue.
static:: make no sense in compile-time constants.
I've just forbidden it there.

Thanks. Dmitry.



> -----Original Message-----
> From: Robin Fernandes [mailto:[EMAIL PROTECTED] 
> Sent: Friday, September 28, 2007 6:45 PM
> To: internals@lists.php.net
> Cc: Stanislav Malyshev; Baptiste Autin; Zoe Slattery; Dmitry 
> Stogov; Marcus Boerger; Lukas Kahwe Smith; Michael Lively; 
> Etienne Kneuss; Andi Gutmans
> Subject: Re: [PHP-DEV] [patch] Late static bindings (LSB)
> 
> 
> Sorry to persist with this, but I think it could be really 
> useful to clarify the meaning of static:: outside of method 
> bodies... particularly since parent:: and self:: can already 
> behave very strangely in such scenarios (see 
> http://news.php.net/php.internals/32443 ).
> 
> For example, I find the following behaviour with the current patch
> counter-intuitive:
> 
> <?php
> // NOTE: X is not related to A.
> class X  {
>   const MY_CONST = "I am completely unrelated to class A.";
>   static function createA() {
>     new A;  // triggers initialiser evaluation
>   }
> }
> 
> class A {
>   const MY_CONST = "const A";
>   public $p = static::MY_CONST;
>   static function getInstance() {
>     return new A;
>   }
> }
> 
> // First instantiate A inside X. This causes A's properties'
> // default values to be evaluated within X's scope. X::createA();
> 
> // Now that A's default values have been evaluated,
> // behaviour is as if any new instance of A treats
> // the occurrence of static:: on line 12 to mean X.
> 
> // Instantiate A inside A:
> $a = A::getInstance();
> var_dump($a->p);    // has value of X::MY_CONST.
> 
> // Instantiate A at global scope:
> $a = new A();
> var_dump($a->p);    // has value of X::MY_CONST.
> ?>
> 
> Actual output:
> string(37) "I am completely unrelated to class A."
> string(37) "I am completely unrelated to class A."
> 
> 
> Some thoughts:
>  - static:: could simply be forbidden in all class 
> property/constant default values.
>  - Any occurrences of static:: in instance property default 
> values could behave as if they were in the constructor, but 
> be forbidden in static property and constant initialisers.
>  - Other ideas?
> 
> 
> Also, there are some questions around reflection. All of the following
> A::reflect*() calls cause a fatal error like:
>   PHP Fatal error:  Undefined class constant 'MY_CONST' in %s 
> on line %d
> 
> <?php
> class A {
>   const MY_CONST = "const A";
>   const C1 = static::MY_CONST;
> 
>   static function f($a = static::MY_CONST) {
>     return $a;
>   }
> 
>   static function f2() {
>     static $x = static::MY_CONST;
>   }
> 
> 
>   static function reflectConst() {
>     $rc = new ReflectionClass('A');
>     var_dump($rc->getConstant('C1'));
>   }
> 
>   static function reflectArg() {
>     $rm = new ReflectionMethod('A::f');
>     $rps = $rm->getParameters();
>     var_dump($rps[0]->getDefaultValue());
>   }
> 
>   static function reflectStat() {
>     $rm = new ReflectionMethod('A::f2');
>     var_dump($rm->getStaticVariables());
>   }
> 
> }
> 
> A::reflectConst(); // fatal error
> A::reflectArg();   // fatal error
> A::reflectStat();  // fatal error
> ?>
> 
> Is this desirable? One could argue that the reflection calls 
> emanate from A::, so static:: could be resolved accordingly. 
> This test case suggests that static:: is in fact being bound 
> to the ReflectionClass class itself (since 
> ReflectionClass::IS_FINAL===64) :
> 
> <?php
> class A {
>   const IS_FINAL = "This string is not integer sixty-four";
>   const C1 = static::IS_FINAL;
> }
> 
> $rc = new ReflectionClass('A');
> $rc->getConstant('C1');  // trigger evaluation of A::C1
> 
> var_dump(A::C1);
> ?>
> 
> Actual output:
> int(64)
> 
> 
> Kind regards,
> Robin
> 
> On 27/09/2007, Jingcheng Zhang <[EMAIL PROTECTED]> wrote:
> > Hello,
> >     static methods seem exactly like dynamic binded methods now, is 
> > there any chance that "abstract static function" being 
> restored from 
> > E_STRICT limitation? Currently it is allowed in interfaces, but 
> > forbidden in abstract class, I don't know why php 
> implements "static 
> > method" in this way, this seems strange.. Thanks!
> >
> > On 9/27/07, Stanislav Malyshev <[EMAIL PROTECTED]> wrote:
> > >
> > > > So, if I understand you well, Stanislas, you are personally not 
> > > > much
> > > into
> > > > "static::" but more into making that sort of code working :
> > > >
> > > > interface iC {
> > > >       public $structure;
> > > > }
> > > > abstract class A implements iC {
> > > >       public function display() {
> > > >               echo self::$structure;
> > > >       }
> > > > }
> > > > class B extends A {
> > > >       static public $structure = "This is a string.";
> > > > }
> > > > $b = new B();
> > > > $b->display();
> > >
> > > No, I don't think we should make interfaces with 
> variables, I'm just 
> > > telling that the code before had API that not allowed correctly 
> > > enforce its requirements.
> > > --
> > > Stanislav Malyshev, Zend Software Architect
> > > [EMAIL PROTECTED]   http://www.zend.com/
> > > (408)253-8829   MSN: [EMAIL PROTECTED]
> > >
> > > --
> > > PHP Internals - PHP Runtime Development Mailing List
> > > To unsubscribe, visit: http://www.php.net/unsub.php
> > >
> > >
> >
> >
> > --
> > Best regards,
> > Jingcheng Zhang
> > Room 304, Dormitory 26 of Yuquan Campus, Zhejiang 
> University P.R.China
> >
> 

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to