【问题标题】:Global PHP class in functions?函数中的全局 PHP 类?
【发布时间】:2011-01-15 21:11:53
【问题描述】:

有没有办法在 PHP 的函数中访问一个类的实例?像这样:

include("class.php");
$bla=new Classname();

function aaa(){
    $bla->DoSomething();  //Doesn't work.
}

$bla->DoSomething();  //Works.

【问题讨论】:

    标签: php class function global


    【解决方案1】:

    如果您想在整个应用程序中强制使用类的单个实例,您应该使用单例,而不是全局。你可以这样做:

    class Classname {
        private static $instance;
    
        private function __construct()  {...}
    
        public function doSomething() {...}
    
        // The singleton method
        public static function singleton()  {
            if ( !isset(self::$instance) ) {
                self::$instance = new self;
            }
    
            return self::$instance;
        }
    
        private function __clone() { /* do nothing here*/ }
    }
    
    
    function aaa() {
        Classname::getInstance()->doSomething();
    }
    

    【讨论】:

    • 链接坏了?
    【解决方案2】:

    如果我正确解释了您的问题,那么正确的做法是创建一个单例类。

    class Singleton {
        private static $instance;
    
        private function __construct() {}
        private function __clone() {}
    
        public static function getInstance() {
            if (!Singleton::$instance instanceof self) {
                 Singleton::$instance = new self();
            }
            return Singleton::$instance;
        }
    
        public function DoSomething() {
            ...
        }
    }
    

    你可以在你的函数中这样调用它:

    function xxx() {
        Singleton::getInstance()->DoSomething();
    }
    

    【讨论】:

    • 但是如果他想要拥有多个该类的实例怎么办?这里不需要单例。
    • 再次阅读他的问题。他特别问“有没有办法在 php 函数中访问一个类的实例”
    • 就像我在答案中已经说过的那样,您应该遵循一个小链接并自己决定单身是否真的是正确的方式:code.google.com/p/google-singleton-detector/wiki/…
    • 没错,他确实应该首先查看所有选项并确定单例方法是否是可行的方法,但该练习留给问题的发布者。这不是我能替他决定的事情……
    【解决方案3】:

    正如已经回答的那样,您可以使用 global variable 来存储类实例,但在我看来,您应该考虑使用类似 Singleton pattern 的东西来实现更简洁的实现。

    您可以找到一个简单的单例类示例here

    【讨论】:

      【解决方案4】:

      更简洁的方法是通过引用给定类来传递实例,然后访问它。

      另一种方法是使用单例模式,尽管许多人认为它并不比全局模式更好。

      【讨论】:

        【解决方案5】:

        使用global:

        function aaa() {
            global $bla;
            $bla->DoSomething();
        }
        

        适用于所有变量,而不仅仅是类。

        【讨论】:

        • 这是最直接的解决方案,至少可以让你的微耦合代码工作,直到编写更优雅的代码。
        猜你喜欢
        • 2013-02-21
        • 2020-05-11
        • 1970-01-01
        • 1970-01-01
        • 2010-12-28
        • 2013-03-19
        • 2012-04-03
        • 1970-01-01
        相关资源
        最近更新 更多