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编写的,所以你需要安装php1
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
下载最新稳定版
运行Zephir安装程序(编译/创建解析器)
1
2
3$ cd zephir
$ ./install-json
$ ./install -c测试安装
1
zephir help
会得到如下返回
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
9namespace Test;
class Hello
{
public function say()
{
echo "Hello World!";
}
}
一但这个类被编译完成,它会产生下面的一段C代码(gcc/clang/vc++编译)1
2
3
4
5
6
7
8EPHIR_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
26namespace 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
4while i < length {
echo typeof myArray[i], "\n";
let i++;
}
PHP的变量总是动态的,函数总是返回的是可变的动态变量,这就意味着如果一个静态变量在Zphir中被返回了,在PHP的调用中 你得到的却是一个动态变量。
请注意!内存是在编译器中自动管理的,所以你没有必要像C语言一样去分配和释放内存。 这和PHP是很相似的。