parent
cd92f89a4b
commit
24924673ec
5 changed files with 168 additions and 0 deletions
@ -0,0 +1,16 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
abstract class AbstractByRefReturn |
||||||
|
{ |
||||||
|
abstract public function &value(): array; |
||||||
|
} |
||||||
|
|
||||||
|
class ConcreteByRefReturn extends AbstractByRefReturn |
||||||
|
{ |
||||||
|
public function value(): array |
||||||
|
{ |
||||||
|
return []; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function main() {} |
||||||
@ -0,0 +1,16 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
interface ByRefReturnContract |
||||||
|
{ |
||||||
|
public function &value(): array; |
||||||
|
} |
||||||
|
|
||||||
|
class ByRefReturnImplementation implements ByRefReturnContract |
||||||
|
{ |
||||||
|
public function value(): array |
||||||
|
{ |
||||||
|
return []; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function main() {} |
||||||
@ -0,0 +1,47 @@ |
|||||||
|
--TEST-- |
||||||
|
Abstract and interface implementations may add a by-reference return |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
|
||||||
|
abstract class AbstractValueSource |
||||||
|
{ |
||||||
|
abstract public function abstractValue(): int; |
||||||
|
} |
||||||
|
|
||||||
|
interface ValueSourceContract |
||||||
|
{ |
||||||
|
public function interfaceValue(): int; |
||||||
|
} |
||||||
|
|
||||||
|
final class ReferenceValueSource extends AbstractValueSource implements ValueSourceContract |
||||||
|
{ |
||||||
|
private int $abstractStored = 5; |
||||||
|
private int $interfaceStored = 7; |
||||||
|
|
||||||
|
public function &abstractValue(): int |
||||||
|
{ |
||||||
|
return $this->abstractStored; |
||||||
|
} |
||||||
|
|
||||||
|
public function &interfaceValue(): int |
||||||
|
{ |
||||||
|
return $this->interfaceStored; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function main(): void |
||||||
|
{ |
||||||
|
$source = new ReferenceValueSource(); |
||||||
|
|
||||||
|
$abstractAlias =& $source->abstractValue(); |
||||||
|
$abstractAlias = 50; |
||||||
|
var_dump($source->abstractValue()); |
||||||
|
|
||||||
|
$interfaceAlias =& $source->interfaceValue(); |
||||||
|
$interfaceAlias = 70; |
||||||
|
var_dump($source->interfaceValue()); |
||||||
|
} |
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
int(50) |
||||||
|
int(70) |
||||||
@ -0,0 +1,71 @@ |
|||||||
|
--TEST-- |
||||||
|
An override may add a by-reference return and preserve alias semantics |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
|
||||||
|
class ByRefReturnParent |
||||||
|
{ |
||||||
|
public function value(): int |
||||||
|
{ |
||||||
|
return -1; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
final class ByRefReturnChild extends ByRefReturnParent |
||||||
|
{ |
||||||
|
private int $stored = 10; |
||||||
|
|
||||||
|
public function &value(): int |
||||||
|
{ |
||||||
|
return $this->stored; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
class StaticByRefReturnParent |
||||||
|
{ |
||||||
|
public static function value(): int |
||||||
|
{ |
||||||
|
return -1; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
final class StaticByRefReturnChild extends StaticByRefReturnParent |
||||||
|
{ |
||||||
|
private static int $stored = 20; |
||||||
|
|
||||||
|
public static function &value(): int |
||||||
|
{ |
||||||
|
return self::$stored; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function readByRefReturnParent(ByRefReturnParent $value): int |
||||||
|
{ |
||||||
|
return $value->value(); |
||||||
|
} |
||||||
|
|
||||||
|
function main(): void |
||||||
|
{ |
||||||
|
$child = new ByRefReturnChild(); |
||||||
|
var_dump(readByRefReturnParent($child)); |
||||||
|
|
||||||
|
$instanceAlias =& $child->value(); |
||||||
|
$instanceAlias = 42; |
||||||
|
var_dump($child->value()); |
||||||
|
var_dump(readByRefReturnParent($child)); |
||||||
|
|
||||||
|
$instanceCopy = $child->value(); |
||||||
|
$instanceCopy = 99; |
||||||
|
var_dump($child->value()); |
||||||
|
|
||||||
|
$staticAlias =& StaticByRefReturnChild::value(); |
||||||
|
$staticAlias = 84; |
||||||
|
var_dump(StaticByRefReturnChild::value()); |
||||||
|
} |
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
int(10) |
||||||
|
int(42) |
||||||
|
int(42) |
||||||
|
int(42) |
||||||
|
int(84) |
||||||
Loading…
Reference in new issue