关于PHP命名空间的几个问题

时间:2011-11-28 18:40:01

标签: php namespaces

我正在将一个现有项目移植到名称空间,我最终打了一些墙,官方文档无法帮助我。也许你们可以! :)

1)如何从命名空间中的上一级扩展一个类?例如:

namespace MyProject\Exceptions;

abstract class Handler {

}

namespace MyProject\Exceptions\Handlers;

class Test extends \MyProject\Exceptions\Handler {

}

2)如何使用具有期望回调功能的命名空间?

namespace MyProject;

class Main {
    public function __construct() {
        set_error_handler(array('MyProject', 'handleErrors'));
    }

    public function handleErrors() {
        echo "hi";
    }
}

2 个答案:

答案 0 :(得分:0)

就像其他命名空间一样。但是,一定要逃避反斜杠!

-edit -

由于我们在这里讨论的是“现代PHP”,我强烈建议您只是将函数作为回调传递而不是使用构建回调的方式。现在,您可以简单地接受一个函数并将其用作回调,就像在其他编程语言(如C ++)中一样。

namespace Foo;
function Bar($callback) { $callback(); }

// Other file
Foo\Bar(function() {
    // Do something
});

答案 1 :(得分:0)

问题1:没有简写来解决当前命名空间“上方”的命名空间。您必须使用完整路径,如上所述。

问题2:您可以使用匿名函数(在5.3中引入),这通常是一个不错的选择:

namespace MyProject;

class Main {
     public function __construct() {
         set_error_handler( function() { 
              echo "hi"; 
         } );
     }
}

但是,使用匿名函数并不总是更好。函数是一个有用的抽象,因为你可以从不同的地方调用它们。匿名函数是创建仅需要一次的函数的简写。

如果您想使用常规的非匿名函数,请首先注意在上面的示例中,您使用的是实例方法,因此您必须提供$ this的实例:

namespace MyProject;

class Main {
     public function __construct() {
         set_error_handler(array($this, 'handleErrors'));
     }

     public function handleErrors() {
         echo "hi";
     }
}

此外,还有一种情况是您希望从命名空间类中寻址静态函数。在这种情况下,数组语法必须包含类名。如果类名具有命名空间,则应使用完整命名空间路径,就像在源代码中一样:

namespace MyProject;

class Main {
    public function __construct() {
        set_error_handler(array('MyProject\Main', 'handleErrors'));
    }

    public static function handleErrors() {
        echo "hi";
    }
}