php-src/Zend/tests/readonly_props/initialization_scope.phpt
Ilija Tovilo daeb3295b2
Improve readonly avis error (GH-15618)
We don't track whether protected(set) is implicit, so for now always point out
when the property is readonly in the error message.
2024-08-29 13:19:31 +02:00

73 lines
1.1 KiB
PHP

--TEST--
Initialization can only happen from private scope
--FILE--
<?php
class A {
public readonly int $prop;
public function initPrivate() {
$this->prop = 3;
}
}
class B extends A {
public function initProtected() {
$this->prop = 2;
}
}
$test = new B;
try {
$test->prop = 1;
} catch (Error $e) {
echo $e->getMessage(), "\n";
}
$test->initProtected();
var_dump($test);
$test = new B;
$test->initPrivate();
var_dump($test->prop);
// Rebinding bypass works.
$test = new B;
(function() {
$this->prop = 1;
})->bindTo($test, A::class)();
var_dump($test->prop);
class C extends A {
public readonly int $prop;
}
$test = new C;
$test->initPrivate();
var_dump($test->prop);
class X {
public function initFromParent() {
$this->prop = 1;
}
}
class Y extends X {
public readonly int $prop;
}
$test = new Y;
$test->initFromParent();
var_dump($test);
?>
--EXPECTF--
Cannot modify protected(set) readonly property A::$prop from global scope
object(B)#%d (1) {
["prop"]=>
int(2)
}
int(3)
int(1)
int(3)
object(Y)#%d (1) {
["prop"]=>
int(1)
}