parent
184090ec84
commit
05a409ac37
13 changed files with 548 additions and 0 deletions
@ -0,0 +1,55 @@ |
||||
--TEST-- |
||||
Extended assignment operators: %=, <<=, >>=, &=, |=, ^= |
||||
--FILE-- |
||||
<?php |
||||
|
||||
function main() { |
||||
// Modulo assignment |
||||
$a = 17; |
||||
$a %= 5; |
||||
var_dump($a); |
||||
|
||||
// Left shift assignment (Expr_AssignOp_ShiftLeft) |
||||
$b = 1; |
||||
$b <<= 3; |
||||
var_dump($b); |
||||
|
||||
// Right shift assignment |
||||
$c = 16; |
||||
$c >>= 2; |
||||
var_dump($c); |
||||
|
||||
// Bitwise AND assignment |
||||
$d = 0xFF; |
||||
$d &= 0x0F; |
||||
var_dump($d); |
||||
|
||||
// Bitwise OR assignment |
||||
$e = 0xF0; |
||||
$e |= 0x0F; |
||||
var_dump($e); |
||||
|
||||
// Bitwise XOR assignment |
||||
$f = 0xFF; |
||||
$f ^= 0x0F; |
||||
var_dump($f); |
||||
|
||||
// Combined |
||||
$x = 100; |
||||
$x %= 7; |
||||
$x += 10; |
||||
var_dump($x); |
||||
|
||||
echo "done\n"; |
||||
} |
||||
|
||||
?> |
||||
--EXPECT-- |
||||
int(2) |
||||
int(8) |
||||
int(4) |
||||
int(15) |
||||
int(255) |
||||
int(240) |
||||
int(12) |
||||
done |
||||
@ -0,0 +1,20 @@ |
||||
--TEST-- |
||||
Break and continue with numeric levels |
||||
--SKIPIF-- |
||||
<?php |
||||
echo "skip Break/continue with levels > 1 not supported in AOT"; |
||||
?> |
||||
--FILE-- |
||||
<?php |
||||
// break 2 |
||||
for ($i = 0; $i < 3; $i++) { |
||||
for ($j = 0; $j < 3; $j++) { |
||||
if ($i == 1 && $j == 2) { |
||||
break 2; |
||||
} |
||||
} |
||||
} |
||||
echo "done\n"; |
||||
?> |
||||
--EXPECT-- |
||||
done |
||||
@ -0,0 +1,55 @@ |
||||
--TEST-- |
||||
Type casts: (int), (float), (string), (bool) |
||||
--FILE-- |
||||
<?php |
||||
|
||||
function main() { |
||||
// Integer cast |
||||
var_dump((int) "123"); |
||||
var_dump((int) 3.14); |
||||
|
||||
// Float cast |
||||
var_dump((float) "3.14"); |
||||
var_dump((float) 10); |
||||
|
||||
// Bool cast with literals — triggers toBool(0L)/toBool(1L) code path |
||||
var_dump((bool) 1); |
||||
var_dump((bool) 0); |
||||
var_dump((bool) "hello"); |
||||
var_dump((bool) ""); |
||||
|
||||
// String cast |
||||
var_dump((string) 123); |
||||
var_dump((string) true); |
||||
var_dump((string) false); |
||||
|
||||
// Bool cast with variables |
||||
$one = 1; |
||||
$zero = 0; |
||||
var_dump((bool) $one); |
||||
var_dump((bool) $zero); |
||||
|
||||
// Nested casts |
||||
$val = (int) (string) (float) "5.7"; |
||||
var_dump($val); |
||||
|
||||
echo "done\n"; |
||||
} |
||||
|
||||
?> |
||||
--EXPECT-- |
||||
int(123) |
||||
int(3) |
||||
float(3.14) |
||||
float(10) |
||||
bool(true) |
||||
bool(false) |
||||
bool(true) |
||||
bool(false) |
||||
string(3) "123" |
||||
string(1) "1" |
||||
string(0) "" |
||||
bool(true) |
||||
bool(false) |
||||
int(5) |
||||
done |
||||
@ -0,0 +1,21 @@ |
||||
--TEST-- |
||||
Error suppression operator @ |
||||
--FILE-- |
||||
<?php |
||||
|
||||
function main() { |
||||
$arr = ["x" => 1]; |
||||
$ret = @$arr["missing"]; |
||||
var_dump($ret); |
||||
|
||||
$result = @file_get_contents("/nonexistent/file/path"); |
||||
var_dump($result); |
||||
|
||||
echo "done\n"; |
||||
} |
||||
|
||||
?> |
||||
--EXPECT-- |
||||
NULL |
||||
bool(false) |
||||
done |
||||
@ -0,0 +1,58 @@ |
||||
--TEST-- |
||||
foreach with key-value and nested structures |
||||
--FILE-- |
||||
<?php |
||||
|
||||
function main() { |
||||
// Simple key-value foreach |
||||
$arr = ["a" => 1, "b" => 2, "c" => 3]; |
||||
$keys = []; |
||||
$vals = []; |
||||
foreach ($arr as $k => $v) { |
||||
$keys[] = $k; |
||||
$vals[] = $v; |
||||
} |
||||
var_dump($keys); |
||||
var_dump($vals); |
||||
|
||||
// Nested foreach |
||||
$matrix = [[1, 2], [3, 4]]; |
||||
$sum = 0; |
||||
foreach ($matrix as $row) { |
||||
foreach ($row as $val) { |
||||
$sum += $val; |
||||
} |
||||
} |
||||
var_dump($sum); |
||||
|
||||
// Foreach on array literal |
||||
$count = 0; |
||||
foreach ([10, 20, 30] as $item) { |
||||
$count += $item; |
||||
} |
||||
var_dump($count); |
||||
|
||||
echo "done\n"; |
||||
} |
||||
|
||||
?> |
||||
--EXPECT-- |
||||
array(3) { |
||||
[0]=> |
||||
string(1) "a" |
||||
[1]=> |
||||
string(1) "b" |
||||
[2]=> |
||||
string(1) "c" |
||||
} |
||||
array(3) { |
||||
[0]=> |
||||
int(1) |
||||
[1]=> |
||||
int(2) |
||||
[2]=> |
||||
int(3) |
||||
} |
||||
int(10) |
||||
int(60) |
||||
done |
||||
@ -0,0 +1,42 @@ |
||||
--TEST-- |
||||
Goto and label statements |
||||
--FILE-- |
||||
<?php |
||||
|
||||
function main() { |
||||
$result = 0; |
||||
|
||||
// Forward goto |
||||
goto forward; |
||||
$result += 100; // skipped |
||||
forward: |
||||
$result += 1; |
||||
|
||||
// Backward goto |
||||
$i = 0; |
||||
loop_start: |
||||
$i++; |
||||
if ($i < 10) { |
||||
goto loop_start; |
||||
} |
||||
$result += $i; |
||||
|
||||
// Goto out of nested structure |
||||
$found = false; |
||||
for ($j = 0; $j < 5; $j++) { |
||||
for ($k = 0; $k < 5; $k++) { |
||||
if ($j == 3 && $k == 2) { |
||||
$found = true; |
||||
goto found_label; |
||||
} |
||||
} |
||||
} |
||||
found_label: |
||||
$result += ($found ? 10 : 0); |
||||
|
||||
var_dump($result); |
||||
} |
||||
|
||||
?> |
||||
--EXPECT-- |
||||
int(21) |
||||
@ -0,0 +1,31 @@ |
||||
--TEST-- |
||||
Heredoc and nowdoc string syntax |
||||
--FILE-- |
||||
<?php |
||||
|
||||
function main() { |
||||
$name = "World"; |
||||
|
||||
$heredoc1 = <<<EOT |
||||
Hello, $name! |
||||
This is a heredoc string. |
||||
EOT; |
||||
|
||||
$nowdoc1 = <<<'NOW' |
||||
Hello, $name! |
||||
This does NOT interpolate. |
||||
NOW; |
||||
|
||||
var_dump($heredoc1); |
||||
var_dump($nowdoc1); |
||||
|
||||
echo "done\n"; |
||||
} |
||||
|
||||
?> |
||||
--EXPECT-- |
||||
string(39) "Hello, World! |
||||
This is a heredoc string." |
||||
string(40) "Hello, $name! |
||||
This does NOT interpolate." |
||||
done |
||||
@ -0,0 +1,34 @@ |
||||
--TEST-- |
||||
instanceof operator |
||||
--FILE-- |
||||
<?php |
||||
|
||||
class Base {} |
||||
class Derived extends Base {} |
||||
interface MyInterface {} |
||||
class Implementor implements MyInterface {} |
||||
|
||||
function main() { |
||||
$base = new Base(); |
||||
$derived = new Derived(); |
||||
$implem = new Implementor(); |
||||
|
||||
var_dump($base instanceof Base); |
||||
var_dump($derived instanceof Base); |
||||
var_dump($base instanceof Derived); |
||||
var_dump($implem instanceof MyInterface); |
||||
var_dump($base instanceof MyInterface); |
||||
var_dump(null instanceof Base); |
||||
|
||||
echo "done\n"; |
||||
} |
||||
|
||||
?> |
||||
--EXPECT-- |
||||
bool(true) |
||||
bool(true) |
||||
bool(false) |
||||
bool(true) |
||||
bool(false) |
||||
bool(false) |
||||
done |
||||
@ -0,0 +1,48 @@ |
||||
--TEST-- |
||||
isset with multiple arguments and edge cases |
||||
--FILE-- |
||||
<?php |
||||
|
||||
function main() { |
||||
$a = "hello"; |
||||
$b = null; |
||||
$c = 0; |
||||
|
||||
// Single isset |
||||
var_dump(isset($a)); |
||||
var_dump(isset($b)); |
||||
var_dump(isset($c)); |
||||
|
||||
// Multi-arg isset |
||||
var_dump(isset($a, $b)); |
||||
var_dump(isset($a, $c)); |
||||
|
||||
// Array isset |
||||
$arr = ["x" => 1, "y" => null]; |
||||
var_dump(isset($arr["x"])); |
||||
var_dump(isset($arr["y"])); |
||||
var_dump(isset($arr["z"])); |
||||
|
||||
// Nested isset |
||||
$data = ["user" => ["name" => "Alice"]]; |
||||
var_dump(isset($data["user"]["name"])); |
||||
var_dump(isset($data["user"]["email"])); |
||||
var_dump(isset($data["missing"]["key"])); |
||||
|
||||
echo "done\n"; |
||||
} |
||||
|
||||
?> |
||||
--EXPECT-- |
||||
bool(true) |
||||
bool(false) |
||||
bool(true) |
||||
bool(false) |
||||
bool(true) |
||||
bool(true) |
||||
bool(false) |
||||
bool(false) |
||||
bool(true) |
||||
bool(false) |
||||
bool(false) |
||||
done |
||||
@ -0,0 +1,23 @@ |
||||
--TEST-- |
||||
Object cast (object) from array |
||||
--FILE-- |
||||
<?php |
||||
|
||||
function main() { |
||||
$data = (object) ["name" => "test", "value" => 42]; |
||||
var_dump($data->name); |
||||
var_dump($data->value); |
||||
|
||||
$empty = (object) []; |
||||
var_dump((array) $empty); |
||||
|
||||
echo "done\n"; |
||||
} |
||||
|
||||
?> |
||||
--EXPECT-- |
||||
string(4) "test" |
||||
int(42) |
||||
array(0) { |
||||
} |
||||
done |
||||
@ -0,0 +1,58 @@ |
||||
--TEST-- |
||||
Ternary shorthand operator ?: |
||||
--FILE-- |
||||
<?php |
||||
|
||||
function main() { |
||||
// Basic ternary shorthand |
||||
$a = "hello"; |
||||
$result1 = $a ?: "default"; |
||||
var_dump($result1); |
||||
|
||||
// Falsy value with shorthand |
||||
$b = ""; |
||||
$result2 = $b ?: "empty"; |
||||
var_dump($result2); |
||||
|
||||
// Zero with shorthand |
||||
$c = 0; |
||||
$result3 = $c ?: 42; |
||||
var_dump($result3); |
||||
|
||||
// Null with shorthand |
||||
$result4 = null ?: "fallback"; |
||||
var_dump($result4); |
||||
|
||||
// Chained shorthand |
||||
$val = null; |
||||
$result5 = $val ?: false ?: "final"; |
||||
var_dump($result5); |
||||
|
||||
// Array item with shorthand |
||||
$arr = ["key" => "present"]; |
||||
$result6 = $arr["missing"] ?: "not found"; |
||||
var_dump($result6); |
||||
|
||||
$result7 = $arr["key"] ?: "not found"; |
||||
var_dump($result7); |
||||
|
||||
// Nested ternary shorthand |
||||
$x = ""; |
||||
$y = "hello"; |
||||
$result8 = $x ?: ($y ?: "neither"); |
||||
var_dump($result8); |
||||
|
||||
echo "done\n"; |
||||
} |
||||
|
||||
?> |
||||
--EXPECT-- |
||||
string(5) "hello" |
||||
string(5) "empty" |
||||
int(42) |
||||
string(8) "fallback" |
||||
string(5) "final" |
||||
string(9) "not found" |
||||
string(7) "present" |
||||
string(5) "hello" |
||||
done |
||||
@ -0,0 +1,45 @@ |
||||
--TEST-- |
||||
unset on arrays and variables |
||||
--FILE-- |
||||
<?php |
||||
|
||||
function main() { |
||||
// Unset variable |
||||
$a = 10; |
||||
unset($a); |
||||
var_dump(isset($a)); |
||||
|
||||
// Unset array element |
||||
$arr = ["x" => 1, "y" => 2, "z" => 3]; |
||||
unset($arr["y"]); |
||||
var_dump(count($arr)); |
||||
var_dump(isset($arr["y"])); |
||||
var_dump($arr["x"]); |
||||
var_dump($arr["z"]); |
||||
|
||||
// Unset last element |
||||
$arr2 = [1, 2, 3, 4]; |
||||
unset($arr2[3]); |
||||
var_dump(count($arr2)); |
||||
|
||||
// Unset with variable key |
||||
$items = ["a" => 1, "b" => 2, "c" => 3]; |
||||
$key = "b"; |
||||
unset($items[$key]); |
||||
var_dump(count($items)); |
||||
var_dump(isset($items["b"])); |
||||
|
||||
echo "done\n"; |
||||
} |
||||
|
||||
?> |
||||
--EXPECT-- |
||||
bool(false) |
||||
int(2) |
||||
bool(false) |
||||
int(1) |
||||
int(3) |
||||
int(3) |
||||
int(2) |
||||
bool(false) |
||||
done |
||||
Loading…
Reference in new issue