Dear Stan:
On 01 Aug 2012, at 01:23, Stan Vass wrote:
> ----------------------------------------------------------------------------
> 1. Name collisions between a trait method and a class method using the trait
> go unreported, the class silently shadowing the trait method:
> ----------------------------------------------------------------------------
>
> trait T {
> function foo() { $this->bar; }
> function bar() { echo 'trait'; }
> }
>
> class C {
> use T;
> function bar() { echo 'class'; }
> }
>
> $c = new C;
> $c->foo(); // "class"
>
> Proposed behavior: Fatal error on collision, unless the method is imported
> with a unique name using the { ... as ... } syntax.
This happens to be 'by design'.
The methods in the class have *always* higher precedence.
This is the same 'overriding' behavior used for inheritance.
From my personal perspective, changing this would lead to a major inconsistency
with how subclassing works.
If you disagree, please open an explicit thread for this problem and report it
in the bug tracker.
> ----------------------------------------------------------------------------
> 2. Using "as" syntax when importing a trait does NOT rename a method, but
> creates an alias CLONE, the original method still callable.
> ----------------------------------------------------------------------------
>
> trait T {
> function bar() { echo 'trait'; }
> }
>
> class C {
> use T { bar as foo; }
> }
>
> $c = new C;
> $c->bar(); // "trait"
>
> Proposed behavior: the original name should be only accessible within the
> trait and its methods, not from the class methods or by calling the class
> instance's methods from outside.
Again, this happens to be 'by design'.
PHP is a rather dynamic language, and we happen to have things like $c->$foo();
where $foo is a string. Renaming is technically not reasonable, and would also
lead to major confusion when metaprogramming is used.
Bye the way, this is documented:
https://wiki.php.net/rfc/horizontalreuse#renaming
> ----------------------------------------------------------------------------
> 3. Properties silently collide in traits and classes.
> ----------------------------------------------------------------------------
>
> trait T1 {
> private $foo;
>
> trait T2 {
> private $foo;
> }
>
> class C { use T1, T2; } // No error.
>
> Proposed behavior: An error is produced only when the properties differ in
> visibility or a default value, which is clearly insufficient to determine
> they're used for the same purpose, and hold the same data. Instead they
> should use the same logic as method conflicts: fatal error on name collision.
> Alternatively, each trait property whould be accessible within the trait that
> defines it, not from other traits used in the same class, or the class itself.
Please read
https://wiki.php.net/rfc/horizontalreuse#handling_of_propertiesstate carefully.
Again, this is intended behavior.
If you want to be notified of such collisions, please use E_STRICT.
> ----------------------------------------------------------------------------
> 4. The documentation says static propeties can't be defined by traits. Yet
> they can.
> ----------------------------------------------------------------------------
>
> I don't know what's the bug here: a doc bug, or a code bug. For consistency,
> static properties should work, if instance properties work. Nothing is gained
> supporting it half-way.
Could you please point me *exactly* to the paragraph where we have something
written about static properties? I do not see that I wrote anything special
about static properties in the RFC. And I do not find it in the docs either.
static properties should work like normal properties.
Best regards
Stefan
--
Stefan Marr
Software Languages Lab
Vrije Universiteit Brussel
Pleinlaan 2 / B-1050 Brussels / Belgium
http://soft.vub.ac.be/~smarr
Phone: +32 2 629 2974
Fax: +32 2 629 3525
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php