基本语法
在本章中, 我们将讨论文件和命名空间、变量声明、杂项语法约定以及其他几个一般概念的组织。
在文件和命名空间中组织代码
在 php 中, 您可以将代码放置在任何文件中, 而不需要特定的结构。 在 Zephir中, 每个文件都必须包含一个类 (并且只有一个类)。 每个类都必须有一个命名空间, 并且目录结构必须与所使用的类和命名空间的名称相匹配。 (这类似于 psr-4 自动加载约定, 只是它是由语言本身强制执行的。
例如, 给定以下结构, 每个文件中的类必须是:
mylibrary/
router/
exception.zep #
router.zep # MyLibrary\Router
Class in mylibrary/router.zep
:
namespace MyLibrary;
class Router
{
}
Class in mylibrary/router/exception.zep
:
namespace MyLibrary\Router;
class Exception extends \Exception
{
}
如果文件或类不在预期文件中, 则 Zephir 将引发编译器异常, 反之亦然。
指令分离
您可能已经注意到, 前一章中的代码示例中很少有分号。 您可以使用分号分隔语句和表达式, 如 java、c/c ++、php 和类似语言:
myObject->myMethod(1, 2, 3); echo "world";
注释
Zephir 支持 “c”/”c++” 注释。 这是行注释 // ...
, 这是多行注释 /* ... */
:
// this is a one line comment
/**
* multi-line comment
*/
在大多数语言中,注释只是编译器/解释器忽略的文本。 在Zephir中,多行注释也用作docblock,它们被导出到生成的代码中,因此它们是语言的一部分!
如果docblock不在预期的位置,编译器将抛出异常。
变量声明
在Zephir中,必须声明给定范围中使用的所有变量。 这为编译器执行优化和验证提供了重要信息。 变量必须是唯一的标识符,它们不能是保留字。
// 在同一指令中声明相同类型的变量
var a, b, c;
// 在单独的行中声明每个变量
var a;
var b;
var c;
变量可以选择有一个初始兼容的默认值:
// 使用默认值声明变量
var a = "hello", b = 0, c = 1.0;
int d = 50; bool some = true;
变量名区分大小写,以下变量不同:
// 不同的变量
var somevalue, someValue, SomeValue;
变量作用域
所有声明的变量都局部作用于声明它们的方法:
namespace Test;
class MyClass
{
public function someMethod1()
{
int a = 1, b = 2;
return a + b;
}
public function someMethod2()
{
int a = 3, b = 4;
return a + b;
}
}
超全局
Zephir不支持全局变量——不允许从PHP代码块访问全局变量。 然而,您可以访问PHP的超全局变量,如下所示:
// 从_POST获取值
let price = _POST["price"];
// 从_SERVER读取值
let requestMethod = _SERVER["REQUEST_METHOD"];
本地符号表
PHP中的每个方法或上下文都有一个符号表,允许您以非常动态的方式编写变量:
<?php
$b = 100;
$a = "b";
echo $$a; // prints 100
Zephir没有实现这个特性,因为所有变量都被编译为低级变量,而且无法知道在特定上下文中存在哪些变量。 如果您想在当前PHP符号表中创建一个变量,您可以使用以下语法:
// Set variable $name in PHP
let {"name"} = "hello";
// Set variable $price in PHP
let name = "price";
let {name} = 10.2;