【问题标题】:Check whether instance of a class exists, if not create an instance检查类的实例是否存在,如果不存在则创建实例
【发布时间】:2014-04-18 19:01:10
【问题描述】:

我想知道是否可以创建一个函数并传递一个类名。然后该函数检查该类的实例当前是否存在,如果不存在,则创建该类的实例。此外,如果可能,使该变量成为全局变量并要求将其返回。我意识到返回可能是唯一的选择。

 function ($class_name) {
      // Check if Exists
      // __autoload will automatically include the file
      // If it does not create a variable where the say '$people = new people();'
      $class_name = new $class_name();

      // Then if possible make this variable a globally accessible var. 
 }

这可能还是我疯了?

【问题讨论】:

  • 所以它假设创建一个空类,例如class somename{}?
  • 不,自动加载包括文件和类。
  • 所以如果该类存在,您要求创建该类的实例?
  • 你确定你不只是想要singleton
  • @case 你有没有解决这个问题?现在在javascript中遇到同样的问题。

标签: php class autoload


【解决方案1】:

eval 几乎是唯一的方法。确保这不是由用户输入提供的,例如来自$_GET$_POST 值,这一点非常重要。

function create_or_return($class_name) {
  if(! class_exists($class_name)) {
    eval("class $class_name { }");
    // put it in the global scope
    $GLOBALS[$class_name] = new $class_name;
  }
}

create_or_return("Hello");
var_dump($GLOBALS['Hello']);
/*
    class Hello#1 (0) {
    }
*/

您不能真正使其全局可访问,因为 PHP 没有像 javascript 那样的全局对象。但你不能简单地制作一个容纳对象的容器。

【讨论】:

    【解决方案2】:

    PHP 有一个名为 class_exists($class_name) 的函数,返回一个布尔值。

    http://www.php.net/manual/en/function.class-exists.php

    【讨论】:

    • 当然可以,但其余的都做不到,或者如果其余的甚至是可能的。
    • 当然……一个简单的if/else条件,如果是else,那么就创建类。然而,这几乎可以肯定是一个可怕的想法并乞求剥削。只需创建一个类并在需要时调用它。
    • @Iscariot 我要么返回类的一个实例,要么在函数外部保存一个变量,如果存在的话,将其初始化为该类。
    • 创建一个类需要用到eval,为什么这是个坏主意eval("class $class_name { function helloWorld() { echo 'hello world'; } }"); $theclass = new class_name(); echo $theclass->helloWorld();
    【解决方案3】:

    类似的东西:

    function some_fumction($class_name) {
        if(class_exists($class_name)) {
            return new $class_name;
        } else {
            throw new Exception("The class $class_name does not exist");
        }
    }
    

    【讨论】:

    • 这行不通。返回值必须设置为 $varname = function();如果它已经设置,这将杀死现有的类。
    • 好吧,您不能在函数内部创建实例并在该函数外部使用它。在这种情况下,做所有这些都是没有意义的,除非你在类构造函数中做所有事情。在这种情况下,我不确定您要达到什么目的。
    • 我就是这么想的。这就是我问的原因。我想知道它是否能够设置该类并使其成为全球性的。
    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    • 2011-05-12
    相关资源
    最近更新 更多