4

我正在用 Phalcon Zephir 做一些实验,看看它可以如何将我的一些库转换为 PHP 扩展。

我有两个 PHP 类,每个类都已在其自己的文件中定义:Zephir 注释非常清楚,必须如此。

trienode.zep

namespace tries;

class trienode
{
    public children;

    public valueNode = false;

    public value = null;

    public function __construct()
    {
        let this->children = [];
    }
}

trie.zep

namespace tries;

class trie {

    private trie;

    public function __construct() {
        let this->trie = new trienode();
    }
}

但是每当我尝试使用编译类时zephir compile,我都会得到

Warning: Class "trienode" does not exist at compile time  in /home/vagrant/ext/tries/tries/trie.zep on 8 [nonexistent-class]

            let this->trie = new trienode();
    ---------------------------------------^

(如果我继续构建过程并安装生成的 .so 文件,当我尝试从 PHP 脚本中使用它时会出错)

<?php

namespace tries;

$test = new trie;

给予

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php5/20121212/tries.so' - /usr/lib/php5/20121212/tries.so: undefined symbol: zephir_tries_trie_init in Unknown on line 0
PHP Fatal error:  Class 'tries\trie' not found in /home/vagrant/triesTest.php on line 5

我浏览了 Zephir 文档和各种博客文章,但找不到任何构建包含多个类文件的扩展的示例。

有没有人成功地使用 Zephir 构建了一个包含多个类的扩展?如果是这样,构建一个有效的 so 需要哪些设置或配置选项(或其他步骤)?

4

1 回答 1

4

看起来命名空间必须包含在调用中。

let this->trie = new tries\trienode();
//                   ^^^^^^

我没有在文档中看到明确提到这一点,但在返回类型提示部分中暗示(请原谅双关语),该部分使用提示中的命名空间。

将您的示例类更改为上面显示的类允许扩展根据需要进行编译。

于 2014-01-25T11:07:28.960 回答