- 在 CompilerBase 中添加了对 Expr_Match 节点的解析支持 - 修改 parseTernary 方法参数类型为 Node\Expr\Ternary - 添加了 parseMatch 方法用于处理 Match 表达式 - 在 Preprocessor 中添加对 Stmt_Enum 和 Stmt_EnumCase 的预处理支持 - 扩展 prepareClass 方法以支持枚举类型的处理 - 在 Translator 中添加对 Stmt_Enum 的翻译支持 - 修改 parseClass 方法以正确处理枚举定义 - 添加测试文件 closure_016.phpt 和 closure_017.phpt 验证闭包功能 - 添加枚举示例文件 enum1.php 展示枚举用法pull/1/head
parent
bd06dcf0a5
commit
46e15ca247
6 changed files with 115 additions and 6 deletions
@ -0,0 +1,26 @@ |
||||
<?php |
||||
interface Colorful { |
||||
public function color(): string; |
||||
} |
||||
|
||||
enum Suit implements Colorful { |
||||
case Hearts; |
||||
case Diamonds; |
||||
case Clubs; |
||||
case Spades; |
||||
|
||||
public function color(): string { |
||||
return match ($this) { |
||||
self::Hearts, self::Diamonds => 'Red', |
||||
self::Clubs, self::Spades => 'Black', |
||||
}; |
||||
} |
||||
} |
||||
|
||||
function main() |
||||
{ |
||||
echo Suit::Hearts->color() . "\n"; |
||||
echo Suit::Diamonds->color() . "\n"; |
||||
echo Suit::Clubs->color() . "\n"; |
||||
echo Suit::Spades->color() . "\n"; |
||||
} |
||||
@ -0,0 +1,54 @@ |
||||
--TEST-- |
||||
Closure 016: closures and is_callable() |
||||
--FILE-- |
||||
<?php |
||||
class Foo { |
||||
function __invoke() { |
||||
echo "Hello World!\n"; |
||||
} |
||||
} |
||||
|
||||
function foo() { |
||||
return function() { |
||||
echo "Hello World!\n"; |
||||
}; |
||||
} |
||||
|
||||
function main() { |
||||
$test = new Foo; |
||||
var_dump(is_callable($test, true, $name)); |
||||
echo $name."\n"; |
||||
var_dump(is_callable($test, false, $name)); |
||||
echo $name."\n"; |
||||
var_dump(is_callable(array($test,"__invoke"), true, $name)); |
||||
echo $name."\n"; |
||||
var_dump(is_callable(array($test,"__invoke"), false, $name)); |
||||
echo $name."\n"; |
||||
$test = foo(); |
||||
var_dump(is_callable($test, true, $name)); |
||||
echo $name."\n"; |
||||
var_dump(is_callable($test, false, $name)); |
||||
echo $name."\n"; |
||||
var_dump(is_callable(array($test,"__invoke"), true, $name)); |
||||
echo $name."\n"; |
||||
var_dump(is_callable(array($test,"__invoke"), false, $name)); |
||||
echo $name."\n"; |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
bool(true) |
||||
Foo::__invoke |
||||
bool(true) |
||||
Foo::__invoke |
||||
bool(true) |
||||
Foo::__invoke |
||||
bool(true) |
||||
Foo::__invoke |
||||
bool(true) |
||||
Closure::__invoke |
||||
bool(true) |
||||
Closure::__invoke |
||||
bool(true) |
||||
Closure::__invoke |
||||
bool(true) |
||||
Closure::__invoke |
||||
@ -0,0 +1,10 @@ |
||||
--TEST-- |
||||
Closure 017: Trying to destroy an active lambda function |
||||
--FILE-- |
||||
<?php |
||||
$a = function(&$a) { $a = 1; }; |
||||
$a($a); |
||||
echo "DONE\n"; |
||||
?> |
||||
--EXPECT-- |
||||
DONE |
||||
Loading…
Reference in new issue