Zephir扩展中的多个类文件

时间:2014-01-25 10:43:11

标签: php zephir

我正在使用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成功构建了一个包含多个类的扩展?如果是这样,那么构建工作所需的设置或配置选项(或其他步骤)是什么?

1 个答案:

答案 0 :(得分:4)

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

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

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

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