Browse Source

- Fix Bug #34019 by popular demand: Implementing interface with a

__construct method strange behaviour
migration/RELEASE_1_0_0
Marcus Boerger 20 years ago
parent
commit
b0f461e9d9
  1. 2
      Zend/zend_compile.c
  2. 19
      tests/classes/ctor_in_interface_01.phpt
  3. 35
      tests/classes/ctor_in_interface_02.phpt
  4. 23
      tests/classes/ctor_in_interface_03.phpt
  5. 26
      tests/classes/ctor_in_interface_04.phpt
  6. 24
      tests/classes/interface_construct.phpt

2
Zend/zend_compile.c

@ -2055,7 +2055,7 @@ static zend_bool zend_do_perform_implementation_check(zend_function *fe, zend_fu
}
/* No implementation checks for constructors */
if (fe->common.fn_flags & ZEND_ACC_CTOR) {
if ((fe->common.fn_flags & ZEND_ACC_CTOR) && !(proto->common.scope->ce_flags & ZEND_ACC_INTERFACE)) {
return 1;
}

19
tests/classes/ctor_in_interface_01.phpt

@ -0,0 +1,19 @@
--TEST--
ZE2 A class constructor must keep the signature of an interface
--FILE--
<?php
interface constr
{
function __construct();
}
class implem implements constr
{
function __construct($a)
{
}
}
?>
--EXPECTF--
Fatal error: Declaration of implem::__construct() must be compatible with that of constr::__construct() in %s on line %d

35
tests/classes/ctor_in_interface_02.phpt

@ -0,0 +1,35 @@
--TEST--
ZE2 A class constructor must keep the signature of all interfaces
--FILE--
<?php
interface constr1
{
function __construct();
}
interface constr2 extends constr1
{
}
class implem12 implements constr2
{
function __construct()
{
}
}
interface constr3
{
function __construct($a);
}
class implem13 implements constr1, constr3
{
function __construct()
{
}
}
?>
--EXPECTF--
Fatal error: Can't inherit abstract function constr3::__construct() (previously declared abstract in constr1) in %s on line %d

23
tests/classes/ctor_in_interface_03.phpt

@ -0,0 +1,23 @@
--TEST--
ZE2 A class constructor must keep the signature of base class interfaces
--FILE--
<?php
interface constr
{
function __construct();
}
abstract class implem implements constr
{
}
class derived extends implem
{
function __construct($a)
{
}
}
?>
--EXPECTF--
Fatal error: Declaration of derived::__construct() must be compatible with that of constr::__construct() in %s on line %d

26
tests/classes/ctor_in_interface_04.phpt

@ -0,0 +1,26 @@
--TEST--
ZE2 A class constructor must keep the signature of base class interfaces
--FILE--
<?php
interface constr
{
function __construct();
}
class implem implements constr
{
function __construct()
{
}
}
class derived extends implem
{
function __construct($a)
{
}
}
?>
--EXPECTF--
Fatal error: Declaration of derived::__construct() must be compatible with that of constr::__construct() in %s on line %d

24
tests/classes/interface_construct.phpt

@ -1,24 +0,0 @@
--TEST--
ZE2 An interface constructor signature must not be inherited
--SKIPIF--
<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
--FILE--
<?php
error_reporting(4095);
interface test {
public function __construct($foo);
}
class foo implements test {
public function __construct() {
echo "foo\n";
}
}
$foo = new foo;
?>
--EXPECT--
foo
Loading…
Cancel
Save