【问题标题】:PHP - create a class set an array var and use it globalPHP - 创建一个类设置一个数组变量并在全局范围内使用它
【发布时间】:2013-01-17 15:39:14
【问题描述】:

我需要一些帮助来解决我不知道如何开始的情况,甚至不知道在哪里寻找。

我有一个大的 *.ini 文件(用于语言),我只想在 php 文档的开头解析一次,然后在文档中的任何地方使用结果。

我想,我需要一门课,比如:

class Language{
    private language = array();

    function get( $string ){
        return $this->language[ $string ];
    }

    function getLanguage(){
        /* get and parse *.ini file once */
        $result = array;

        /* set language */
        $this->language = $result;
    }
}

因此,理论上,在 php 文档开始时,该类会以某种方式调用 getLanguage() 并设置语言数组

Language::getLanguage();

然后,在 php 文档的其余部分,尤其是在其他类中(不作为函数参数发送),在不再次解析 *.ini 文件的情况下获取特定语言数组元素。

class AClass{
    function __construct(){
        echo Language::get( $certain_string );
    }
}
new AClass;

任何建议都会受到好评。

谢谢。

【问题讨论】:

    标签: php class global


    【解决方案1】:

    为了能够使用 :: 调用方法,您需要将其声明为静态。

    class Language {
        private static $lang = null; // you won't be able to get this directly
        public static function getLanguage(){
            if (self::$lang) { // you can check with is_null() or !is_array()
                return self::$lang; 
            }
            else { /* parse ini file here and set it in self::$lang */ }
        }
    }
    Language::getLanguage();
    

    我认为这就是你所需要的。如果您需要进一步调整,请告诉我。

    PS:如果您声明private function __construct(){}private function __clone(){} - 这将是经典的Singleton design pattern

    【讨论】:

    • 我明白了,所以基本的解决方案是使用静态方法,我做了一个测试,正是我需要的。非常感谢您的快速回答
    【解决方案2】:

    如果你需要使用 Language::getLanguage();您应该将此函数定义为静态函数。

    public static function getLanguage(){
            /* get and parse *.ini file once */
            $result = array;
    
            /* set language */
            $this->language = $result;
        }
    

    但我建议使用“单例”模式:

    class Language{
    
        static private $_instance = null;
    
        private language = array();
    
        private function __construct(){}
        private function __clone(){}
    
        public static function getInstance(){
            if (self::$_instance === null){
                self::$_instance = new self();
            }
            return self::$_instance;
        }
    
        public function get( $string ){
            return $this->language[ $string ];
        }
    
        public function getLanguage(){
            /* get and parse *.ini file once */
            $result = array;
    
            /* set language */
            $this->language = $result;
        }
    }
    

    所以使用它你可以像这样调用这个类的方法:

    Language::getInstance()->get('str');
    Language::getInstance()->getLanguage();
    

    【讨论】:

    • 感谢您的快速回答。静态方法是解决方案。我将记录单例模式
    猜你喜欢
    • 2022-01-27
    • 2015-03-22
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多