调用方法

方法可以使用对象操作符 -> 调用,就像在PHP中:

  1. namespace Test;
  2. class MyClass
  3. {
  4. protected function _someHiddenMethod(a, b)
  5. {
  6. return a - b;
  7. }
  8. public function someMethod(c, d)
  9. {
  10. return this->_someHiddenMethod(c, d);
  11. }
  12. }

必须使用静态操作符 :: 调用静态方法:

  1. namespace Test;
  2. class MyClass
  3. {
  4. protected static function _someHiddenMethod(a, b)
  5. {
  6. return a - b;
  7. }
  8. public static function someMethod(c, d)
  9. {
  10. return self::_someHiddenMethod(c, d);
  11. }
  12. }

您可以按照以下动态方式调用方法:

  1. namespace Test;
  2. class MyClass
  3. {
  4. protected adapter;
  5. public function setAdapter(var adapter)
  6. {
  7. let this->adapter = adapter;
  8. }
  9. public function someMethod(var methodName)
  10. {
  11. return this->adapter->{methodName}();
  12. }
  13. }

参数名

Zephir 支持按名称或关键字参数调用方法参数。 如果您希望以任意顺序传递参数、记录参数的含义或以更优雅的方式指定参数,那么命名参数可能非常有用。

请考虑下面的示例. 一个名为 Image 的类具有接收四个参数的方法:

  1. namespace Test;
  2. class Image
  3. {
  4. public function chop(width = 600, height = 400, x = 0, y = 0)
  5. {
  6. //...
  7. }
  8. }

使用标准方法调用方法:

  1. i->chop(100); // width=100, height=400, x=0, y=0
  2. i->chop(100, 50, 10, 20); // width=100, height=50, x=10, y=20

使用命名参数, 您可以:

  1. i->chop(width: 100); // width=100, height=400, x=0, y=0
  2. i->chop(height: 200); // width=600, height=200, x=0, y=0
  3. i->chop(height: 200, width: 100); // width=100, height=200, x=0, y=0
  4. i->chop(x: 20, y: 30); // width=600, height=400, x=20, y=30

当编译器(在编译时) 不知道这些参数的正确顺序时,必须在运行时解析它们。 在这种情况下,可能会有一个最小的额外额外开销:

  1. let i = new {someClass}();
  2. i->chop(y: 30, x: 20);