Базовый синтаксис

В этой главе мы обсудим организацию файлов и пространств имен, объявления переменных, разные синтаксические соглашения и несколько других концепций.

Организация кода в файлах и пространствах имён

В PHP вы можете поместить код в любой файл без определенной структуры. В Zephir каждый файл должен содержать класс (и только один класс). Каждый класс должен иметь пространство имён, а структура каталогов должна соответствовать именам используемых классов и имен. (Это похоже на соглашение автозагрузки классов PSR-4, за исключением того, что оно обеспечивается за счёт самого языка).

Например, для следующей структуры классы в каждом файле должны быть:

mylibrary/
    router/
        exception.zep # MyLibrary\Router\Exception
    router.zep # MyLibrary\Router

Класс в mylibrary/router.zep:

namespace MyLibrary;

class Router
{

}

Класс в 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++. Это однострочные комментарии вида // ..., и многострочные комментариями вида /* ... */:

// Это однострочный

/**
 * Многострочный комментарий
 */

В большинстве языков комментарии — это просто текст, игнорируемый компилятором/интерпретатором. В Zephir многострочные комментарии также используются в качестве блоков документации (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;

Область переменной

Все объявленные переменные локально охвачены методом, в котором они были объявлены:

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; // выведет 100

Zephir не реализует этот функционал, так как все переменные скомпилированы до низкоуровневых переменных и не существует способа узнать, какие переменные существуют в определенном контексте. Если вы хотите создать переменную в текущей таблице символов PHP, вы можете использовать следующий синтаксис:

// Установить переменную $name в PHP
let {"name"} = "hello";

// Установить переменную $price в PHP
let name = "price";
let {name} = 10.2;