PHP 翻译器 class - 关于最佳实践的意见
PHP Translator class - Opinions on best practice
我正在制作自己的框架,并且有一个翻译器 class 在整个应用程序的几个地方使用。
我担心的是翻译器 class 有一个构造函数,其中包含所有必要的翻译文件,这意味着每个具有翻译器的对象都可能多次包含这些文件。
这是译者的例子class。
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 如果我没记错的话,仍然存在多个包含的问题。
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;
}
...
}
最后一个想法,使用 public 函数而不是 class
$translations = //Include the language array files like in the translator class
function translate($key){
global $translations;
return $translations[$key];
}
编辑
我发现静态 classes 更容易使用。基本上,您不需要在需要时获取转换器的实例,您可以通过使用静态 class 在整个应用程序中使用它。我认为使用静态 classes 存在性能问题,但显然新 PHP 版本并非如此。
查看此内容以了解如何制作和使用静态 classes:
Is it possible to create static classes in PHP (like in C#)?
旧
正如 Jon 所提到的,我最终选择的方法是翻译器的单例 class。基本上,翻译器实例只创建一次,所有请求翻译器实例的地方都会得到相同的实例。在使用之前,请务必了解这种方法的缺点。
这是一个很好的例子来说明如何做到这一点
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();
我正在制作自己的框架,并且有一个翻译器 class 在整个应用程序的几个地方使用。
我担心的是翻译器 class 有一个构造函数,其中包含所有必要的翻译文件,这意味着每个具有翻译器的对象都可能多次包含这些文件。
这是译者的例子class。
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 如果我没记错的话,仍然存在多个包含的问题。
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;
}
...
}
最后一个想法,使用 public 函数而不是 class
$translations = //Include the language array files like in the translator class
function translate($key){
global $translations;
return $translations[$key];
}
编辑
我发现静态 classes 更容易使用。基本上,您不需要在需要时获取转换器的实例,您可以通过使用静态 class 在整个应用程序中使用它。我认为使用静态 classes 存在性能问题,但显然新 PHP 版本并非如此。
查看此内容以了解如何制作和使用静态 classes: Is it possible to create static classes in PHP (like in C#)?
旧
正如 Jon 所提到的,我最终选择的方法是翻译器的单例 class。基本上,翻译器实例只创建一次,所有请求翻译器实例的地方都会得到相同的实例。在使用之前,请务必了解这种方法的缺点。
这是一个很好的例子来说明如何做到这一点 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();