我正在创建自己的框架,并且在整个应用程序的几个地方都有一个翻译类。
我担心的是翻译类有一个构造函数,其中包含了翻译所需的所有文件,这意味着每个拥有翻译器的对象都可能多次包含这些文件。
这是翻译类的一个例子。
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/Topics/oop.html
class View extends Translator{
...
}
根据我对对象组成的了解,这就是我如何理解它应该如何制作的。错误?如果没有,这会产生翻译类的多个实例,如果我没有弄错的话,仍然存在多个包含的问题。
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];
}
答案 0 :(得分:0)
修改强>
我发现静态类更容易使用。基本上,您不需要在需要时获取翻译器的实例,您可以使用静态类在整个应用程序中使用它。我认为使用静态类存在性能问题,但显然新的PHP版本并非如此。
检查一下以了解如何制作和使用静态类: Is it possible to create static classes in PHP (like in C#)?
<强> OLD 强>
正如Jon所提到的那样,我最终选择的方法是翻译的单例类。基本上,翻译器实例只创建一次,并且要求翻译器的实例获得相同的实例。确保在使用之前了解这种方法的缺点。
以下是如何执行此操作的一个很好的示例 Creating the Singleton design pattern in PHP5
快速演示
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();