Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将静态类指定给局部变量_Php_Oop_Static_Static Members - Fatal编程技术网

Php 将静态类指定给局部变量

Php 将静态类指定给局部变量,php,oop,static,static-members,Php,Oop,Static,Static Members,因此,在PHP中,我知道静态类存在于全局名称空间中,因此在必须调用它们时会导致开销 但是当您将一个局部类变量,或者仅仅是一个局部变量分配给该静态类时会发生什么呢?全局引用的开销是否已删除 在我的特定情况下,我使用的是静态单例 class Registry { public static $user; public static $DB; public static $config; public static $user_data; priva

因此,在PHP中,我知道静态类存在于全局名称空间中,因此在必须调用它们时会导致开销

但是当您将一个局部类变量,或者仅仅是一个局部变量分配给该静态类时会发生什么呢?全局引用的开销是否已删除

在我的特定情况下,我使用的是静态单例

class Registry {

     public static $user;
     public static $DB;
     public static $config;
     public static $user_data;
     private static $initialized = FALSE;

     public static function init($config) {
          if (!registry::$initialized) {
               registry::$config = $config;
               registry::$DB = new db($config['mysql']);
               registry::$user = new user();
               registry::$initialized = TRUE;
          } else {
               throw new Exception('Registry has already been initialized.');
          }
     }
}
现在,为了让问题更清楚,将另一个类中的注册表映射到连续函数调用的类变量/局部变量是否有益

class SomethingSomethingDarkSide {

     private $registry;
     private $db;
     private $config;

     public function __construct() {
          $this->registry = Registry;
          $this->db = Registry::$db;
          $this->config = Registry::$config;
     }
}
由于静态成员现在是在初始化类变量之后分配给该类变量的,调用利用这些类变量的连续方法是否会消除静态成员保留的全局命名空间的开销

编辑:在这种情况下,请删除Singleton的概念。问题更多的是我们是否必须在每次引用变量后查找注册表。

即:

vs

或:


我认为您最初的问题是您的单例实现不正确。请看以下代码:

class Registry {

    private static $instance = null;

    private $user;
    private $DB;
    private $config;
    private $user_data;

    public static function getInstance($config) {
        if (self::$instance === null)
        {
            self::$instance = new self($config);
        }

        return self::$instance;
    }

    private function __construct($config) {
        $this->$config = $config;
        $this->$DB = new db($config['mysql']);
        $this->$user = new user();
    }

    public function doThing() {
    }

}

$registry = Registry::getInstance($config);
$registry->doThing();
由于构造函数是私有的,因此获取
Registry
类的新实例的唯一方法是使用公共静态方法
getInstance
。 从那时起,您就有了一个
$registry
变量,它指向
registry
类的一个实例(如果它不是您想要的,那么我不理解您为什么要使用单例模式…)

我认为这很接近你想要的:

$registry = Registry;
$registry->doSomething();
$registry->doSomething2();
$registry->doSomething3();

并因此在必须调用它们时造成开销。
不是真正的开销,使用静态与开销无关,但不必访问全局命名空间本身会不断增加开销吗?让我编辑以添加一些示例。
$registry::doSomething()---为什么在已有实例的情况下需要静态方法调用?“我知道全局命名空间中存在静态类,因此在必须调用它们时会导致开销。”---这不是真的。一旦问题以一个错误的陈述开始,其中的一切都没有多大意义,不是吗?(向上投票获得0余额,因为它仍然不应该受到惩罚)@pomeh通读之后,我认为让问题更相关将是消除回到我原来的问题是单身的想法。注册表是一个单例,因为它的数据必须初始化一次,而且只能初始化一次,对它的所有其他引用只能是静态引用。我知道我的解释令人困惑,因为我总是缺少同事来讨论这些主题。我认为,我们正在讨论单例实现这一事实与这个问题无关。我想说的是,如果我们分配
$registry=registry
,那么现在通过
$registry
调用是否避免通过名称空间解析
registry
?如果我不是很清楚的话,我很抱歉。我想您已经知道,
$registry=registry
不是有效的PHP指令(这就是为什么您要问的!)。但是我得到了你想要的&我想不出任何解决方案,所以我会让其他用户以比我更好的方式帮助你。然而,我仍然认为您可能有一个概念而不是PHP问题:如果我总结一下,您希望静态类注册表只初始化一次实例变量,并在所有代码中以静态方式调用该类。恕我直言,你把事情复杂化了,我想不出任何有效的使用案例,但我可能错了这一点,尽管
$registry=registry
是一条有效的PHP指令,因为某种原因它可以工作。如果您运行我在中编辑的最后一个示例,它会正常工作。是的,你可以说这比实际用例更具概念性。你是对的,它在PHP5.3到5.6和PHP7中有效,但它确实触发了一个通知
通知:使用未定义的常量XXX-假定为“XXX”
(请参阅)。如果它起作用了,那你有什么问题?我想我明白了,但没有。无论如何,我不认为这真的能解决你的问题,因为你不用
Registry
到处使用
$Registry
,我仍然认为这是一个错误的概念问题,那么你认为什么是更好的解决方案呢?单态还是完全静态?
class Test {
      public static function sayHi() {
          echo 'Hi';
      }
}

$test = Test;

echo $test::sayHi(); // This being done multiple times versus
echo Test::sayHi(); // That being done multiple times
class Registry {

    private static $instance = null;

    private $user;
    private $DB;
    private $config;
    private $user_data;

    public static function getInstance($config) {
        if (self::$instance === null)
        {
            self::$instance = new self($config);
        }

        return self::$instance;
    }

    private function __construct($config) {
        $this->$config = $config;
        $this->$DB = new db($config['mysql']);
        $this->$user = new user();
    }

    public function doThing() {
    }

}

$registry = Registry::getInstance($config);
$registry->doThing();
$registry = Registry;
$registry->doSomething();
$registry->doSomething2();
$registry->doSomething3();