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();