4

Phalcon Zephir を使っていくつかの実験を行って、ライブラリの一部を PHP 拡張機能にどれだけうまく変換できるかを確認しています。

私は 2 つの PHP クラスを持っていますが、それぞれが独自のファイルで既に定義されています。

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 を使用して構築することに成功した人はいますか? もしそうなら、動作するように構築するためにどのような設定または構成オプション (または追加の手順) が必要ですか?

4

1 に答える 1

4

名前空間を呼び出しに含める必要があるようです。

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

これはドキュメントで明示的に言及されているのを見ませんでしたが、ヒントで名前空間を使用する戻り値の型のヒントのセクションで (駄洒落を許して) 示唆されています。

サンプル クラスを上記のように変更すると、拡張機能を必要に応じてコンパイルできます。

于 2014-01-25T11:07:28.960 に答える