Zephir安装和初体验

Zephir安装

环境依赖

Zephir主要依赖于下面环境

  • gcc >= 4.x/clang >= 3.x
  • re2c 0.13或更高版本
  • gnu 3.81或更高版本
  • autoconf 2.31或更高版本
  • automake 1.14或更高版本
  • libpcre3
  • php开发工具-phpize

如果你使用Ubuntu,你可以安装所需要的包

1
2
$ sudo apt-get update
$ sudo apt-get install git gcc make re2c php5 php5-json php5-dev libpcre3-dev

由于Zephir是用PHP编写的,所以你需要安装php

1
2
3
4
5
$ php -v
PHP 5.6.5 (cli) (built: Jan 24 2015 20:04:31)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2014 Zend Technologies
with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies

同时也必须确保安装了PHP开发库

1
2
3
4
5
$ phpize -v
Configuring for:
PHP Api Version: 20131106
Zend Module Api No: 20131226
Zend Extension Api No: 220131226

安装Zephir

  1. 下载最新稳定版

  2. 运行Zephir安装程序(编译/创建解析器)

    1
    2
    3
    $ cd zephir
    $ ./install-json
    $ ./install -c
  3. 测试安装

    1
    zephir help
  4. 会得到如下返回

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     _____              __    _
    /__ / ___ ____ / /_ (_)____
    / / / _ \/ __ \/ __ \/ / ___/
    / /__/ __/ /_/ / / / / / /
    /____/\___/ .___/_/ /_/_/_/
    /_/

    Zephir version 0.9.2a-dev

    Usage:
    command [options]

    Available commands:
    install Installs the extension (requires root password)
    builddev Generate/Compile/Install a Zephir extension in development mode
    help Displays this help
    build Generate/Compile/Install a Zephir extension
    compile Compile a Zephir extension
    stubs Generates extension PHP stubs
    version Shows the Zephir version
    init [namespace] Initializes a Zephir extension
    fullclean Cleans the generated object files in compilation
    api [--theme-path=/path][--output-directory=/path][--theme-options={json}|/path]Generates a HTML API
    generate Generates C code from the Zephir code
    clean Cleans the generated object files in compilation

    Options:
    -f([a-z0-9\-]+) Enables compiler optimizations
    -fno-([a-z0-9\-]+) Disables compiler optimizations
    -w([a-z0-9\-]+) Turns a warning on
    -W([a-z0-9\-]+) Turns a warning off

Zephir初体验

还记得在开篇那个Helloword例子吗?我们先来简单介绍一下Zephir编译机制,在用例子介绍一下Zephir的语法。

编译/解释

每一种语言都会有它们的”Hello World!”例子,对于Zehpir来说也不例外,下面的这个引导例子列举了许多它重要的特性。

Zephir的代码必须放置在类中。Zephir是基于面向对象类/框架打造的。所以代码放置在类的外面是不允许的。另外,一个命名空间也是必须的。

1
2
3
4
5
6
7
8
9
namespace Test;

class Hello
{

public function say()
{

echo "Hello World!";
}
}

一但这个类被编译完成,它会产生下面的一段C代码(gcc/clang/vc++编译)

1
2
3
4
5
6
7
8
EPHIR_INIT_CLASS(Test_Hello) {
ZEPHIR_REGISTER_CLASS(Test, Hello, hello, test_hello_method_entry, 0);
return SUCCESS;
}

PHP_METHOD(Test_Hello, say) {
php_printf("%s", "Hello World!");
}

事实上,使用Zephir的开发者无需懂得C语言,如果你有使用编译器,或者php内部的构造,或者C语言本身的经验, 在使用Zephir的时候你将会感到更加的清晰。

Zephir初试

在接下来的例子中,我们将会尽详细的描述,以便你知道是怎么回事。 我们的目标是让你感觉一下到底Zephir是怎么样的一个东西。 随便我们将会详细的探索Zephir的新特性。

下面的例子很简单,它提供一个类和一个函数,检测一个数组的类型

让我们认真的检查下面的代码,开始认真的的学习Zephir. 这几行代码包括了很多详细的东西,我们将会慢慢的解释。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
namespace Test;

/**
* MyTest (test/mytest.zep)
*/

class MyTest {
public function someMethod() {
/* 变量必须声明 */
var myArray;
int i = 0, length;

/*创建一个数组 */
let myArray = ["hello", 0, 100.25, false, null];

/* 数组有多少个元素*/
let length = count(myArray);

/* 打印值类型 */
while i < length {
echo typeof myArray[i], "\n";
let i++;
}

return myArray;
}
}

在函数中,第一行使用了’var’ 和 ‘int’ 关键词来声明一个函数内的私有变量。 在函数中的每一个变量必须事先声明它们自己的类型。这些声明并不是随意的,它帮助编译器来报告给你关于 错误的变量,或者变量的使用是否超出的它的范围,通常它会在最后抛出错误。

动态的变量必须以关键词’var’来声明。这些变量可以被指定或再指定成不同的变量类型。另一方面,’i’ and ‘length’使用了整数的静态变量,在执行程序的过程中,它只能改变值,而不能改变变量的类型。

与PHP不同的是,你不用在变量的前面加上($)符号。

Zephir的注释和Java, C#, C++等等一些语言的一样。

默认的,变量是不变的,意思是说Zephir期望大部分的变量保持不变。变量保持它们原始的值不变可以优化成静态常量。 如果需要改变变量的值,请使用关键词’let’

1
2
/* 创建一个数组 */
let myArray = ["hello", 0, 100.25, false, null];

默认的,数组是一种象PHP一样的动态变量,它包含了许多不同类型的值。令人吃惊的是,PHP内部的函数可以在Zephir中使用,在下面的例子中,’count’ 函数被使用了,编辑器可以以最佳的状态来执行,因为它已经知道了数组的长度了。

1
2
/*数组有多少个元素 */
let length = count(myArray);

同样的,我们可以使用花括号来控制程序的流程.

1
2
3
4
while i < length {
echo typeof myArray[i], "\n";
let i++;
}

PHP的变量总是动态的,函数总是返回的是可变的动态变量,这就意味着如果一个静态变量在Zphir中被返回了,在PHP的调用中 你得到的却是一个动态变量。

请注意!内存是在编译器中自动管理的,所以你没有必要像C语言一样去分配和释放内存。 这和PHP是很相似的。

-------------本文结束感谢您的阅读-------------