Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
--TEST--
Non-readonly class cannot extend a readonly class
Readonly class cannot extend a non-readonly class
--FILE--
<?php

readonly class Foo
class Foo
{
}

class Bar extends Foo
readonly class Bar extends Foo
{
}

?>
--EXPECTF--
Fatal error: Non-readonly class Bar cannot extend readonly class Foo in %s on line %d
Fatal error: Readonly class Bar cannot extend non-readonly class Foo in %s on line %d
16 changes: 0 additions & 16 deletions Zend/tests/readonly_classes/readonly_class_inheritance_error2.phpt

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
--TEST--
Non-readonly class can extend a readonly class
--FILE--
<?php

readonly class Foo
{
}

class Bar extends Foo
{
}

?>
--EXPECT--
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
--TEST--
Non-readonly child of a readonly class can create dynamic properties
--FILE--
<?php

readonly class Foo
{
}

class Bar extends Foo
{
}

$bar = new Bar();
$bar->baz = 1;

?>
--EXPECTF--
Deprecated: Creation of dynamic property Bar::$baz is deprecated in %s on line %d
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
--TEST--
Non-readonly child of a readonly class can accept the AllowDynamicProperties attribute
--FILE--
<?php

readonly class Foo
{
}


#[AllowDynamicProperties]
class Bar extends Foo
{
}

$bar = new Bar();
$bar->baz = 1;

?>
--EXPECTF--
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
--TEST--
Non-readonly child of a readonly class can declare non-readonly properties
--FILE--
<?php

readonly class Foo
{
}

class Bar extends Foo
{
public static $property1 = 1;
public static int $property2 = 2;
public $property3 = 3;
public int $property4 = 4;
}

$bar = new Bar();
Bar::$property1 = 2;
Bar::$property2 = 3;
$bar->property3 = 4;
$bar->property4 = 5;

var_dump(Bar::$property1);
var_dump(Bar::$property2);
var_dump($bar);

?>
--EXPECT--
int(2)
int(3)
object(Bar)#1 (2) {
["property3"]=>
int(4)
["property4"]=>
int(5)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
--TEST--
Non-readonly child of a readonly class can declare non-readonly properties indirectly via a trait
--FILE--
<?php

trait BarTrait
{
public static $property1 = 1;
public static int $property2 = 2;
public $property3 = 3;
public int $property4 = 4;
}

readonly class Foo
{
}

class Bar extends Foo
{
use BarTrait;
}

$bar = new Bar();
Bar::$property1 = 2;
Bar::$property2 = 3;
$bar->property3 = 4;
$bar->property4 = 5;

var_dump(Bar::$property1);
var_dump(Bar::$property2);
var_dump($bar);

?>
--EXPECT--
int(2)
int(3)
object(Bar)#1 (2) {
["property3"]=>
int(4)
["property4"]=>
int(5)
}
2 changes: 1 addition & 1 deletion Zend/zend_inheritance.c
Original file line number Diff line number Diff line change
Expand Up @@ -1461,7 +1461,7 @@ ZEND_API void zend_do_inheritance_ex(zend_class_entry *ce, zend_class_entry *par
}
}

if (UNEXPECTED((ce->ce_flags & ZEND_ACC_READONLY_CLASS) != (parent_ce->ce_flags & ZEND_ACC_READONLY_CLASS))) {
if (UNEXPECTED((ce->ce_flags & ZEND_ACC_READONLY_CLASS) && !(parent_ce->ce_flags & ZEND_ACC_READONLY_CLASS))) {
zend_error_noreturn(E_COMPILE_ERROR, "%s class %s cannot extend %s class %s",
ce->ce_flags & ZEND_ACC_READONLY_CLASS ? "Readonly" : "Non-readonly", ZSTR_VAL(ce->name),
parent_ce->ce_flags & ZEND_ACC_READONLY_CLASS ? "readonly" : "non-readonly", ZSTR_VAL(parent_ce->name)
Expand Down