On 20/09/2007, Stanislav Malyshev <[EMAIL PROTECTED]> wrote:
>
> I think we better spend time on figuring out the concept and then do the
> patch than first do the patch and then discover we don't know how it was
> supposed to work :)
Here's a question that I think hasn't been discussed and isn't covered
by the test cases in the patch: will static:: have a meaning in
property and constant declarations? e.g.:
<?
class A {
const MY_CONST = "const A";
public $p = static::MY_CONST;
}
class B extends A {
const MY_CONST = "const B";
}
$a = new A();
$b = new B();
var_dump($a::p, $b::p);
?>
One reason I ask is that in php5.2, self:: and parent:: can (imho) act
counter-intuitively in property declarations. They do not always
behave as if they were bound at compile time. See test case below and
http://news.php.net/php.internals/31961 for more details.
(if these inconsistencies are bugs, please let me know and I'll
happily raise them on bugzilla)
<?php
class A {
const MY_CONST = 'MY_CONST_A';
public static $inheritedStatic = self::MY_CONST;
public $inheritedProp = self::MY_CONST;
const INHERITED_CONST = self::MY_CONST;
public static function inheritedStaticMethod() {
return self::MY_CONST;
}
public function inheritedMethod() {
return self::MY_CONST;
}
}
class B extends A {
const MY_CONST = 'MY_CONST_B';
}
echo "\n Static Properties:\n";
new B; // !!! Removing this line changes behaviour !!!
echo " - In A: "; var_dump(A::$inheritedStatic);
echo " - In B: "; var_dump(B::$inheritedStatic);
echo "\n Instance Properties\n";
$a = new A;
$b = new B;
echo " - In A: "; var_dump($a->inheritedProp);
echo " - In B: "; var_dump($b->inheritedProp);
echo "\n Constants:\n";
echo " - In A: "; var_dump(A::INHERITED_CONST);
echo " - In B: "; var_dump(B::INHERITED_CONST);
echo "\n Static call:\n";
echo " - From A: "; var_dump(A::inheritedStaticMethod());
echo " - From B: "; var_dump(B::inheritedStaticMethod());
echo "\n Instance call:\n";
echo " - From A: "; var_dump($a->inheritedMethod());
echo " - From B: "; var_dump($b->inheritedMethod());
?>
-- Actual Output on php5 --
Static Properties:
- In A: string(10) "MY_CONST_B"
- In B: string(10) "MY_CONST_B"
Instance Properties
- In A: string(10) "MY_CONST_A"
- In B: string(10) "MY_CONST_B"
Constants:
- In A: string(10) "MY_CONST_A"
- In B: string(10) "MY_CONST_B"
Static call:
- From A: string(10) "MY_CONST_A"
- From B: string(10) "MY_CONST_A"
Instance call:
- From A: string(10) "MY_CONST_A"
- From B: string(10) "MY_CONST_A"
-- Expected output assuming self:: is bound at compile time --
Static Properties:
- In A: string(10) "MY_CONST_A"
- In B: string(10) "MY_CONST_A"
Instance Properties
- In A: string(10) "MY_CONST_A"
- In B: string(10) "MY_CONST_A"
Constants:
- In A: string(10) "MY_CONST_A"
- In B: string(10) "MY_CONST_A"
Static call:
- From A: string(10) "MY_CONST_A"
- From B: string(10) "MY_CONST_A"
Instance call:
- From A: string(10) "MY_CONST_A"
- From B: string(10) "MY_CONST_A"
Kind regards,
Robin Fernandes
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php