每个 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扩展。