本帖最后由 gn1984102 于 2011-01-23 17:37:34 编辑

解决方案 »

  1.   


    class test{
    public $t="test";
    }
    function get_instance($class_name){
    return new $class_name;
    }
    //var_dump(class_exists("mysql_database"));
    if(class_exists("test")){
    echo get_instance("test")->t;
    }
      

  2.   

    对象是有作用范围的,函数内部的对象全局看不到,不过你可以对全局对象进行搜索,用get_class获取对象的类名.
      

  3.   


    这个方法不错class test{
        public $t="test";
    }
    function get_instance($class_name){
        return new $class_name;
    }
    //var_dump(class_exists("mysql_database"));
    if(class_exists("test")){
        echo "<pre/>";
        var_dump(get_object_vars(get_instance("test")));
    }
      

  4.   


    这个方法消耗大了点吧.....我觉得如果有这种需求, 倒不如自己来做对象的管理, 规范对象的创建/销毁...对象掌握在自己手里的时候, 那就很好实现这样的功能了, 比如:class A {
    }
    class AFactory {
      private static $_instances;
      public static createA1() {
        return self::$_instances[] = new A();
      }
      public static createA2() {
        return self::$_instances[] = new A();
      }
    }
      

  5.   


    得不到整个程序域中的,但是可以得到当前页面中的,因为PHP是单线程的,不像C#那样有整个应用程序域级别的全局的对象变量并能很方便地进行反射
      

  6.   

    php5里面有个函数可以检查,是否有类存在!你可以看看手册
      

  7.   

    和和。我的意思楼上的都没明白。或者我没说清楚。。比如
    $s=new class();
    下边在用class_exist的时候肯定为true
    系统中存在此对象。我想问有没直接得到此对象实例的功能。上边实例化过了。
    比如:
    new xxx();
    if(class_exist(xxx))
      $cls=此处返回xxx类。而不是重新new一个。
      

  8.   

    class factory{
    protected static $factory = array();

    /**
     * new instance
     * @param string $className A class name
     * @param array $args A construct arguments array
     * @return $obj$className object
     */
    public static function newInstance($className,$args = null){
    if(array_key_exists($className,self::$factory)){
    return self::$factory[$className];
    }
    $refl = new ReflectionClass($className);
    $class = $refl->newInstanceArgs($args);
    self::$factory[$className] = &$class;
    return $class;
    }
    }
      

  9.   

    如果,硬是要从内存中读取前面未知实例化了的类,这个,php的api中好像是没有的。只能通过其他方法,比如C扩展。
    实例化一个类,就是开辟了一个地址空间,这个地址是根据目前内存使用情况随机取的,所以,在没有记录这个地址的情况下,想获取也是需要开销的。最保险就是做工厂或者类本身做单例了。
      

  10.   

    还有,你这种愿望本身就违背了访问控制的设计。如果随处都能获取到已经实例化的对象,这样不就没有访问的控制了嘛。什么private,protected都没用了。我想得到你就得到你了。
    程序有个作用域的,在同作用域中,没必要这要做。不同作用域中这么做了,就违反语言本身设计初衷了。