教程

Zephir和本手册是为希望创建 c 扩展的 php 开发人员准备的, 其复杂性较低。

我们假设您在一种或多种其他编程语言方面有丰富的经验。 我们与 php、c、javascript 和其他语言中的功能进行了比较。 我们将指出Zephir中与这些其他语言相似的特性,以及许多新的或不同的特性。 如果您熟悉这些特定的语言,您将更快地了解这些比较。

在本指南中, 我们将使用标准的 linux 终端命令。 如果您是 windows 用户, 则需要将这些命令替换为对应命令。

检查安装

如果您已成功安装 Zephir, 则可以在控制台中执行以下命令:

zephir 帮助

如果一切正常, 您应该看到以下帮助 (或非常相似的内容):

 _____              __    _
/__  /  ___  ____  / /_  (_)____
  / /  / _ \/ __ \/ __ \/ / ___/
 / /__/  __/ /_/ / / / / / /
/____/\___/ .___/_/ /_/_/_/
         /_/

Zephir version 0.10.9a-dev

Usage:
    command [options]

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

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

如果出现问题, 请返回到 installation 页面。

扩展骨架

我们要做的第一件事就是生成扩展骨架。 这将为我们的扩展提供我们开始工作所需的基本结构。 在我们的示例中, 我们将创建一个名为 utils 的扩展:

zephir init utils

在此之后, 将在当前工作目录上创建一个名为 "utils" 的目录:

utils/
   ext/
   utils/

目录 ext/ (内部实用程序) 包含编译器将用于生成扩展的代码。 创建的另一个目录是 utils-此目录与我们的扩展具有相同的名称。 我们将把 Zephir 代码放在那里。

我们需要将工作目录更改为 "utils", 以开始编译我们的代码:

cd utils
ls
ext/ utils/ config.json

目录列表还将向我们显示一个名为 config.json 的文件。 此文件包含配置设置, 我们可以使用这些设置来更改 Zephir 和/或扩展本身的行为。

添加我们的第一个类

Zephir 旨在生成面向对象的扩展。 要开始开发功能, 我们需要将我们的第一个类添加到扩展中。

与许多语言工具一样, 我们首先要做的是看到 Zephir 生成的 "0>hello world< a0 > 0", 并检查一切是否正常。 因此, 我们的第一个类将被称为 Utils\Greeting, 并包含一个方法打印 < 0>hello world!。

此类的代码必须放在 utils/utils/greeting.zep:

namespace Utils;

class Greeting
{

    public static function say()
    {
        echo "hello world!";
    }

}

现在, 我们需要告诉 Zephir, 我们的项目必须编译并生成扩展:

zephir build

最初,也只是第一次,执行了许多内部命令,生成必要的代码和配置,以便将该类导出到PHP扩展。 如果一切顺利, 您将在输出的末尾看到以下消息:

...
Extension installed!
添加 extension=utils.so 到你的 php.ini
不要忘记重启你的服务器

在上述步骤中, 您很可能需要提供根密码才能安装扩展。

最后, 必须将扩展添加到 php.ini 才能由 php 加载。 这是通过添加初始化指令来实现的:extension=utils.so

注意:您还可以在命令行上使用-d extension=utils.so来加载它。 因此,但它只会为那个请求加载,所以每次在CLI中测试扩展时都需要包含它。 将指令添加到 php.ini 将确保从此以后为每个请求加载它。

初步测试

现在扩展已经添加到php.ini,执行以下操作检查扩展是否正确加载:

php -m
[PHP Modules]
Core
date
libxml
pcre
Reflection
session
SPL
standard
tokenizer
utils
xdebug
xml

扩展utils应该是输出的一部分,表明扩展被正确加载。 现在,让我们看看由PHP直接执行的hello world。 为此,您可以创建一个简单的PHP文件,调用我们刚刚创建的静态方法:

<?php

echo Utils\Greeting::say(), "\n";

祝贺您! 在PHP运行你的第一个扩展。

一个有用的类

Utils Greeting::say方法可以检查我们的环境是否正确。 现在, 让我们创建一些更有用的类。

我们要添加到此扩展中的第一个有用的类将为用户提供筛选功能。 此类称为 Utils\Filter 其代码必须放在 utils/utils/filter.zep:

此类的基本框架如下所示:

namespace Utils;

class Filter
{

}

该类包含筛选方法, 这些方法可帮助用户从字符串中筛选不需要的字符。 第一种方法称为 alpha, 其目的是只筛选那些 ASCII 基本字母的字符。 首先, 我们只是遍历字符串, 将每个字节打印到标准输出:

namespace Utils;

class Filter
{

    public function alpha(string str)
    {
        char ch;

        for ch in str {
            echo ch, "\n";
        }
    }
}

调用此方法时:

<?php

$f = new Utils\Filter();
$f->alpha("hello");

您将看到:

h
e
l
l
o

检查字符串中的每个字符很简单。 现在, 我们将使用正确的筛选字符创建另一个字符串:

class Filter
{

    public function alpha(string str) -> string
    {
        char ch; string filtered = "";

        for ch in str {
            if (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') {
                let filtered .= ch;
            }
        }

        return filtered;
    }
}

完整的方法可以像以前一样进行测试:

<?php

$f = new Utils\Filter();
echo $f->alpha("!he#02l3'121lo."); // prints "hello"

在下面的屏幕截图中, 您可以观看如何创建本教程中介绍的扩展:

结语

这是一个非常简单的教程, 正如您所看到的, 使用 Zephir开始构建扩展很容易。 我们邀请您继续阅读手册, 以便您可以发现 Zephir提供的其他功能!