我正在使用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成功构建了一个包含多个类的扩展?如果是这样,那么构建工作所需的设置或配置选项(或其他步骤)是什么?
答案 0 :(得分:4)
看起来命名空间必须包含在调用中。
let this->trie = new tries\trienode();
// ^^^^^^
我没有在文档中明确提到这一点,但在Return Type Hints部分暗示了(请原谅双关语),该部分使用提示中的命名空间。
将您的示例类更改为上面显示的类允许扩展根据需要进行编译。