- 添加对象克隆功能测试,验证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