我正在将一个现有项目移植到名称空间,我最终打了一些墙,官方文档无法帮助我。也许你们可以! :)
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";
}
}
答案 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";
}
}