Edit report at https://bugs.php.net/bug.php?id=62069&edit=1
ID: 62069
Updated by: laruence@php.net
Reported by: laruence@php.net
Summary: binding wrong traits if they have same name methods
Status: Assigned
Type: Bug
Package: Scripting Engine problem
PHP Version: 5.4.3
Assigned To: dmitry
Block user comment: N
Private report: N
New Comment:
@gron, the second example is try to description another bug of the first example,
that is , if the class have a own defined same name as trait, no fatal error
occurred, :)
Previous Comments:
------------------------------------------------------------------------
[2012-05-19 13:55:05] gron@php.net
Hi Laruence:
The first example is a bug, indeed.
Why is the second example a bug?
To me it looks like the perfectly intended traits semantics, no?
------------------------------------------------------------------------
[2012-05-19 06:44:30] laruence@php.net
and if the class have no own func method defination, the result will be:
<?php
trait T1 {
public function func() {
echo "From T1\n";
}
}
trait T2 {
public function func() {
echo "From T2\n";
}
}
class Bar {
use T1 {
func as f1;
}
use T2 {
func as f2;
}
}
PHP Fatal error: Trait method func has not been applied, because there are
collisions with other trait methods on Bar in /tmp/1.php on line 21
this should also be a bug. thanks :)
------------------------------------------------------------------------
[2012-05-19 06:40:54] laruence@php.net
Hi, dmitry, could you please look at this? thanks
the problem occurrs in zend_traits_merge_functions. in that function, it will
unique the trait methods name.
the fix will be a big change, since we should re-implemention the whole merge
functions mechanism, maybe add the tarit name as a suffix to method name.
thanks
------------------------------------------------------------------------
[2012-05-19 06:30:40] laruence@php.net
Description:
------------
if a function binding more than two traits and they have same method name, the
result is wrong.
Test script:
---------------
<?php
trait T1 {
public function func() {
echo "From T1\n";
}
}
trait T2 {
public function func() {
echo "From T2\n";
}
}
class Bar {
public function func() {
echo "From Bar\n";
}
use T1 {
func as f1;
}
use T2 {
func as f2;
}
}
$b = new Bar();
$b->f2();
Expected result:
----------------
From T2
Actual result:
--------------
From T1
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=62069&edit=1