• 类修饰符
    • 实现接口

    每个 Zephir 文件都必须实现一个类或接口 (并且只有一个)。 类结构与 php 类非常相似:

    1. namespace Test;
    2. /**
    3. * This is a sample class
    4. */
    5. class MyClass
    6. {
    7. }

    类修饰符

    支持以下类修饰符:

    final: 如果一个类有这个修饰符,它就不能被扩展:

    1. namespace Test;
    2. /**
    3. * This class cannot be extended by another class
    4. */
    5. final class MyClass
    6. {
    7. }

    abstract: 如果一个类有这个修饰符,它不能被实例化:

    1. namespace Test;
    2. /**
    3. * This class cannot be instantiated
    4. */
    5. abstract class MyClass
    6. {
    7. }

    实现接口

    Zephir 类可以实现任意数量的接口, 前提是这些接口 显性 的引用(使用use)。 但是, 有时 Zephir 类 (以及随后的扩展) 可能需要实现在不同扩展中构建的接口。

    如果我们想要实现MiddlewareInterfacePSR扩展,我们需要创建一个stub接口:

    1. // middlewareinterfaceex.zep
    2. namespace Test\Oo\Extend;
    3. use Psr\Http\Server\MiddlewareInterface;
    4. interface MiddlewareInterfaceEx extends MiddlewareInterface
    5. {
    6. }

    从这里开始,我们可以在整个扩展过程中使用stub接口。

    1. /**
    2. * @test
    3. */
    4. public function shouldExtendMiddlewareInterface()
    5. {
    6. if (!extension_loaded('psr')) {
    7. $this->markTestSkipped(
    8. "The psr extension is not loaded"
    9. );
    10. }
    11. $this->assertTrue(
    12. is_subclass_of(MiddlewareInterfaceEx::class, 'Psr\Http\Server\MiddlewareInterface')
    13. );
    14. }

    NOTE开发人员有责任确保在加载扩展之前存在所有外部引用。 因此,对于上面的示例,在加载Zephir构建的扩展之前,必须先加载PSR扩展。