PHP翻译课程 - 关于最佳实践的意见

时间:2015-11-13 18:36:34

标签: php oop global-variables global extends

我正在创建自己的框架,并且在整个应用程序的几个地方都有一个翻译类。

我担心的是翻译类有一个构造函数,其中包含了翻译所需的所有文件,这意味着每个拥有翻译器的对象都可能多次包含这些文件。

这是翻译类的一个例子。

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];
}

1 个答案:

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