Browse Source

- A method called like a trait is no constructor

experimental/lemon
Johannes Schlüter 16 years ago
parent
commit
0262fdf3e9
  1. 28
      Zend/tests/traits/noctor001.phpt
  2. 2
      Zend/zend_compile.c

28
Zend/tests/traits/noctor001.phpt

@ -0,0 +1,28 @@
--TEST--
Don't mark trait methods as constructor
--FILE--
<?php
trait Foo {
public function Foo() {
}
}
class Bar {
use Foo;
public function Bar() {
}
}
$rfoofoo = new ReflectionMethod('Foo::Foo');
var_dump($rfoofoo->isConstructor());
$rbarfoo = new ReflectionMethod('Bar::Foo');
var_dump($rbarfoo->isConstructor());
$rbarbar = new ReflectionMethod('Bar::Bar');
var_dump($rbarbar->isConstructor());
?>
--EXPECT--
bool(false)
bool(false)
bool(true)

2
Zend/zend_compile.c

@ -1591,7 +1591,7 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n
zend_str_tolower_copy(class_lcname, CG(active_class_entry)->name, CG(active_class_entry)->name_length);
/* Improve after RC: cache the lowercase class name */
if ((CG(active_class_entry)->name_length == name_len) && (!memcmp(class_lcname, lcname, name_len))) {
if ((CG(active_class_entry)->name_length == name_len) && ((CG(active_class_entry)->ce_flags & ZEND_ACC_TRAIT) != ZEND_ACC_TRAIT) && (!memcmp(class_lcname, lcname, name_len))) {
if (CG(active_class_entry)->constructor) {
zend_error(E_STRICT, "Redefining already defined constructor for class %s", CG(active_class_entry)->name);
} else {

Loading…
Cancel
Save