Edit report at https://bugs.php.net/bug.php?id=61943&edit=1

 ID:                 61943
 Comment by:         franssen dot roland at gmail dot com
 Reported by:        franssen dot roland at gmail dot com
 Summary:            Trait same property conflict in class extending
 Status:             Assigned
 Type:               Feature/Change Request
 Package:            Scripting Engine problem
 Operating System:   Ubuntu
 PHP Version:        5.4.2
 Assigned To:        gron
 Block user comment: N
 Private report:     N

 New Comment:

E.g. something like;

<?php
trait A { }
trait B { }
class Foo { use A; }
class Bar extends Foo { use B; }


Previous Comments:
------------------------------------------------------------------------
[2012-05-05 11:50:41] franssen dot roland at gmail dot com

Also i did'nt read your comment well, especially the "semantical difference" 
part.. ;-)

------------------------------------------------------------------------
[2012-05-05 11:46:06] franssen dot roland at gmail dot com

I cheered to soon :-) now Bar has 2 individual property definitions (makes 
sense ofcourse), so this doesn't solve my architecture problem.

We can debat on if the architecture is a code smell or not, but i can 
understand i'm overusing traits here. Traits are simply not suitable for this.

I'll revise it so that the traits complement each other, rather than 
"extending" each other.

------------------------------------------------------------------------
[2012-05-05 09:35:59] franssen dot roland at gmail dot com

Of course.. private visibility.. you sir, are a genius :')

I get away with this since the trait is mainly for accessors only.

However, i have this (personal) convention to use protected properties with 
accessors, mainly pragmatic reasons (overriding default values by defintion). I 
think i'll need to revise my conventions for private properties usage, perhaps 
the strict way.

http://fabien.potencier.org/article/47/pragmatism-over-theory-protected-vs-private

------------------------------------------------------------------------
[2012-05-05 09:12:45] g...@php.net

No, I disagree with your premise.

They are two different properties.
Look at the output of the following program.
This is a perfectly valid usecase and avoids name clashes.
Yes, the visibility is here private and it makes semantically a difference.

But still, defining a property with the same name in two classes in the same 
inheritance chain is always a code smell. And that is exactly what you are 
doing, since you got two 'use' declarations.

I can see your desire to make it logically one, but that does not fit into the 
idea of flattening a trait into a class.

<?php
error_reporting(E_ALL);

trait A {
    private $prop;
}
trait B {
    use A;
}
class FooT {
    use A;
}
class BarT extends FooT {
    use B;
}


class Foo             { private $prop; }
class Bar extends Foo { private $prop; }
$o = new Bar;
var_dump($o);

$o = new BarT;
var_dump($o);

------------------------------------------------------------------------
[2012-05-05 09:00:05] franssen dot roland at gmail dot com

We can agree there's only 1 property definition right?

The concrete classes Foo and Bar will never define that property since that 
would be a "real" conflict.

So if you know that Bar::$prop is initially resolved from A::$prop as well as 
B::$prop you could say it's the same definition...

Why i want this? I want to extend a package in a subpackage on class level as 
well as trait level. The concrete subpackage classes extend the corresponding 
package classes and i don't want to override the package trait functions in 
each subpackage concrete class so the subpackage comes with its own trait, 
build upon the package trait.

It's really an architecture thing..

<?php
namespace Base {
    trait MainTrait { public $prop; }
    class Main { use MainTrait; }
}
namespace Base\Sub {
    trait MainTrait { use \Base\MainTrait; }
    class Main extends \Base\Main { use MainTrait; }
}

------------------------------------------------------------------------


The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at

    https://bugs.php.net/bug.php?id=61943


-- 
Edit this bug report at https://bugs.php.net/bug.php?id=61943&edit=1

Reply via email to