教程

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

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

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

检查安装

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

zephir 帮助

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

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

Zephir 0.12.2 by Andres Gutierrez and Serghei Iakovlev (4ab69bd9)

Usage:
  command [options] [arguments]

Options:
      --dumpversion  Print the version of the compiler and don't do anything else
  -h, --help         Print this help message
      --no-ansi      Disable ANSI output
  -V, --version      Print compiler version information and quit

Available commands:
  api        Generates a HTML API based on the classes exposed in the extension
  build      Generates/Compiles/Installs a Zephir extension
  clean      Cleans any object files created by the extension
  compile    Compile a Zephir extension
  fullclean  Cleans any object files created by the extension (including files generated by phpize)
  generate   Generates C code from the Zephir code without compiling it
  help       Displays help for a command
  init       Initializes a Zephir extension
  install    Installs the extension in the extension directory (may require root password)
  stubs      Generates stubs that can be used in a PHP IDE

If something went wrong, please return back to the installation page.

扩展骨架

我们要做的第一件事就是生成扩展骨架。 这将为我们的扩展提供我们开始工作所需的基本结构。 在我们的示例中, 我们将创建一个名为 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!</0 >。

此类的代码必须放在 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提供的其他功能!