PHP翻译器类-最佳实践意见



我正在制作自己的框架,并有一个翻译器类,该类在整个应用程序的几个地方使用。

我担心的是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();

相关内容

  • 没有找到相关文章