|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2012-05-04 20:07 UTC] franssen dot roland at gmail dot com
Description:
------------
Hi,
(version is actually 5.4RC9...)
The same property conflict happens when you have 2 traits (B uses A) where A defines the property, class Foo uses A and class Bar uses B _and_ extends Foo.
I would love to see the strict standard to be removed in this situation; how can a property have a conflict with itself?
Test script:
---------------
<?php
trait A {
public $prop;
}
trait B {
use A;
}
class Foo {
use A;
}
class Bar extends Foo {
use B;
}
Expected result:
----------------
<void>
Actual result:
--------------
Strict Standards: Foo and B define the same property ($prop) in the composition of Bar. This might be incompatible, to improve maintainability consider using accessor methods in traits instead.
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Thu Dec 11 23:00:01 2025 UTC |
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; } }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);E.g. something like; <?php trait A { } trait B { } class Foo { use A; } class Bar extends Foo { use B; }