- 添加对象克隆功能测试,验证clone关键字的正确性 - 添加复合赋值运算符测试,覆盖数组、对象属性等场景 - 添加exit/die语言结构测试,验证程序退出行为 - 添加嵌套闭包功能测试,验证闭包作用域和链式调用pull/1/head
parent
33725b87d3
commit
184090ec84
4 changed files with 188 additions and 0 deletions
@ -0,0 +1,35 @@ |
||||
--TEST-- |
||||
Clone keyword for object cloning |
||||
--FILE-- |
||||
<?php |
||||
|
||||
class Counter { |
||||
public int $value; |
||||
|
||||
public function __construct(int $v) { |
||||
$this->value = $v; |
||||
} |
||||
|
||||
public function increment(): void { |
||||
$this->value++; |
||||
} |
||||
} |
||||
|
||||
function main() { |
||||
$original = new Counter(10); |
||||
$original->increment(); |
||||
|
||||
$cloned = clone $original; |
||||
$cloned->increment(); |
||||
$cloned->increment(); |
||||
|
||||
var_dump($original->value); |
||||
var_dump($cloned->value); |
||||
var_dump($original->value !== $cloned->value); |
||||
} |
||||
|
||||
?> |
||||
--EXPECT-- |
||||
int(11) |
||||
int(13) |
||||
bool(true) |
||||
@ -0,0 +1,62 @@ |
||||
--TEST-- |
||||
Compound assignment in expressions |
||||
--FILE-- |
||||
<?php |
||||
|
||||
class Counter { |
||||
public int $val = 0; |
||||
} |
||||
|
||||
function main() { |
||||
// Array dim fetch with assignment operators |
||||
$arr = [1, 2, 3]; |
||||
$arr[0] += 10; |
||||
$arr[1] *= 3; |
||||
$arr[2] -= 1; |
||||
var_dump($arr); |
||||
|
||||
// Property with assignment operators |
||||
$obj = new Counter(); |
||||
$obj->val += 5; |
||||
$obj->val *= 2; |
||||
$obj->val -= 3; |
||||
$obj->val %= 4; |
||||
var_dump($obj->val); |
||||
|
||||
// Chained assignments |
||||
$a = $b = $c = 10; |
||||
var_dump($a); |
||||
var_dump($b); |
||||
var_dump($c); |
||||
|
||||
// Reference assignment |
||||
$y = 2; |
||||
$z = &$y; |
||||
$y = 5; |
||||
var_dump($z); |
||||
|
||||
// Global variable with assignment |
||||
global $config; |
||||
$config = ["debug" => true]; |
||||
var_dump($config["debug"]); |
||||
|
||||
echo "done\n"; |
||||
} |
||||
|
||||
?> |
||||
--EXPECT-- |
||||
array(3) { |
||||
[0]=> |
||||
int(11) |
||||
[1]=> |
||||
int(6) |
||||
[2]=> |
||||
int(2) |
||||
} |
||||
int(3) |
||||
int(10) |
||||
int(10) |
||||
int(10) |
||||
int(5) |
||||
bool(true) |
||||
done |
||||
@ -0,0 +1,35 @@ |
||||
--TEST-- |
||||
exit/die language constructs |
||||
--FILE-- |
||||
<?php |
||||
|
||||
function testExit(int $code): void { |
||||
if ($code > 0) { |
||||
echo "should not reach here\n"; |
||||
} |
||||
echo "code is zero\n"; |
||||
} |
||||
|
||||
function processValue(mixed $val): string { |
||||
if (!is_string($val)) { |
||||
die("not a string"); |
||||
} |
||||
return "string: " . $val; |
||||
} |
||||
|
||||
function main() { |
||||
testExit(0); |
||||
|
||||
$result = processValue("hello"); |
||||
var_dump($result); |
||||
|
||||
$status = 42; |
||||
$x = $status == 0 ? 'zero' : 'non-zero'; |
||||
var_dump($x); |
||||
} |
||||
|
||||
?> |
||||
--EXPECT-- |
||||
code is zero |
||||
string(13) "string: hello" |
||||
string(8) "non-zero" |
||||
@ -0,0 +1,56 @@ |
||||
--TEST-- |
||||
Nested closures and closure scope |
||||
--FILE-- |
||||
<?php |
||||
|
||||
function makeMultiplier(int $factor): Closure { |
||||
return function (int $value) use ($factor): int { |
||||
return $value * $factor; |
||||
}; |
||||
} |
||||
|
||||
function makeAdder(int $base): Closure { |
||||
return function (int $value) use ($base): int { |
||||
return $value + $base; |
||||
}; |
||||
} |
||||
|
||||
function makeFormatter(string $prefix): Closure { |
||||
return function (string $name) use ($prefix): string { |
||||
return $prefix . ": " . $name; |
||||
}; |
||||
} |
||||
|
||||
function makeChain(int $x): Closure { |
||||
return function (int $y) use ($x): Closure { |
||||
return function (int $z) use ($x, $y): int { |
||||
return $x + $y + $z; |
||||
}; |
||||
}; |
||||
} |
||||
|
||||
function main() { |
||||
$double = makeMultiplier(2); |
||||
$add5 = makeAdder(5); |
||||
|
||||
var_dump($double(10)); |
||||
var_dump($add5(10)); |
||||
|
||||
$result = $add5($double(3)); |
||||
var_dump($result); |
||||
|
||||
$format = makeFormatter("User"); |
||||
var_dump($format("Alice")); |
||||
|
||||
$chain = makeChain(1); |
||||
$chain2 = $chain(2); |
||||
var_dump($chain2(3)); |
||||
} |
||||
|
||||
?> |
||||
--EXPECT-- |
||||
int(20) |
||||
int(15) |
||||
int(11) |
||||
string(11) "User: Alice" |
||||
int(6) |
||||
Loading…
Reference in new issue