我正在制作自己的框架,并有一个翻译器类,该类在整个应用程序的几个地方使用。
我担心的是translator类有一个构造函数,它包含了翻译所需的所有文件,这意味着每个有translator的对象都可能多次包含这些文件。
这是翻译器类的一个示例。
class Translator{
protected $translations;
public function __construct(){
$this->translations[] = include $this->language . ".php"; //General texts for a language
$this->translations[] = include $this->language . "-" . $this->controller . ".php"; //General texts for a controller
$this->translations[] = include $this->language . "-" . $this->controller . "-" . $this->action . ".php"; //Specific texts for an action
}
public function translate($key){
return $this->translations[$key];
}
}
这就是如何通过扩展来做到这一点在阅读了关于物体构图的文章后,似乎强烈反对这种方式。看见http://www.cs.utah.edu/~germain/PPS/Ttopics/oop.html
class View extends Translator{
...
}
根据我所读到的关于物体构图的内容,这就是我理解它应该如何制作的方式。错误的如果没有,这将生成翻译器类的多个实例,如果我没有弄错的话,仍然存在多个include的问题。
class View{
protected $translator;
public function __construct(){
$this->translator = new Translator();
}
...
}
与其创建一个新的翻译器,不如把它放在一个全局变量中?
$translator = new Translator();
class View{
protected $translator;
public function __construct(){
global $translator
$this->translator = $translator;
}
...
}
最后一个想法,使用公共函数而不是类
$translations = //Include the language array files like in the translator class
function translate($key){
global $translations;
return $translations[$key];
}
编辑
我发现静态类更容易使用。基本上,您不需要在需要时获得翻译器的实例,您可以通过使用静态类在整个应用程序中使用它。我认为使用静态类会有性能问题,但显然新的PHP版本并非如此。
看看这个,了解如何创建和使用静态类:有可能在PHP中创建静态类吗(就像在C#中一样)?
旧
正如Jon所提到的,我最终选择的方法是翻译器的一个单例类。基本上,翻译器实例只创建一次,所有请求翻译器实例的地方都会得到相同的实例。在使用这种方法之前,一定要了解它的缺点
下面是一个如何做到这一点的好例子在PHP5 中创建Singleton设计模式
快速演示
final class Translator{
protected $translations;
public static function getInstance(){
static $inst = null;
if ($inst === null){
$inst = new Translator();
}
return $inst;
}
private function __construct(){ //Private constructor so nobody else can instance it
...//Look at translator class in question
}
}
要获得翻译器的实例,请在需要的地方调用它。
$translator = Transaltor::getInstance();