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