既然能判断一个类是否存在。能否得到一个存在的类的对象吗? 本帖最后由 gn1984102 于 2011-01-23 17:37:34 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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;} 对象是有作用范围的,函数内部的对象全局看不到,不过你可以对全局对象进行搜索,用get_class获取对象的类名. 这个方法不错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")));} 这个方法消耗大了点吧.....我觉得如果有这种需求, 倒不如自己来做对象的管理, 规范对象的创建/销毁...对象掌握在自己手里的时候, 那就很好实现这样的功能了, 比如:class A {}class AFactory { private static $_instances; public static createA1() { return self::$_instances[] = new A(); } public static createA2() { return self::$_instances[] = new A(); }} 得不到整个程序域中的,但是可以得到当前页面中的,因为PHP是单线程的,不像C#那样有整个应用程序域级别的全局的对象变量并能很方便地进行反射 php5里面有个函数可以检查,是否有类存在!你可以看看手册 和和。我的意思楼上的都没明白。或者我没说清楚。。比如$s=new class();下边在用class_exist的时候肯定为true系统中存在此对象。我想问有没直接得到此对象实例的功能。上边实例化过了。比如:new xxx();if(class_exist(xxx)) $cls=此处返回xxx类。而不是重新new一个。 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; }} 如果,硬是要从内存中读取前面未知实例化了的类,这个,php的api中好像是没有的。只能通过其他方法,比如C扩展。实例化一个类,就是开辟了一个地址空间,这个地址是根据目前内存使用情况随机取的,所以,在没有记录这个地址的情况下,想获取也是需要开销的。最保险就是做工厂或者类本身做单例了。 还有,你这种愿望本身就违背了访问控制的设计。如果随处都能获取到已经实例化的对象,这样不就没有访问的控制了嘛。什么private,protected都没用了。我想得到你就得到你了。程序有个作用域的,在同作用域中,没必要这要做。不同作用域中这么做了,就违反语言本身设计初衷了。 php上传文件问题 调查一下大家的php环境都是啥 apache上已经安装缓存插件(eAccelerator),还有必要再生成php缓存文件吗? 用面向对象怎么获取form表单的值? 请教大家一个简单的问题(phpMyAdmin-2.7.0-pl2) 正则表达式问题!100分送上 怎样删除第一条数据? 有谁见过这样的异常信息:“连接占线导致另一个hstmt...”,在线等待! 如何从asp中向php中传递变量 帮我看看这个代码,修改功能,无法修改附件。其他正常修改。post方式提交 PHP imagetypes() 请高手帮忙,php程序执行慢的问题
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;
}
这个方法不错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")));
}
这个方法消耗大了点吧.....我觉得如果有这种需求, 倒不如自己来做对象的管理, 规范对象的创建/销毁...对象掌握在自己手里的时候, 那就很好实现这样的功能了, 比如:class A {
}
class AFactory {
private static $_instances;
public static createA1() {
return self::$_instances[] = new A();
}
public static createA2() {
return self::$_instances[] = new A();
}
}
得不到整个程序域中的,但是可以得到当前页面中的,因为PHP是单线程的,不像C#那样有整个应用程序域级别的全局的对象变量并能很方便地进行反射
$s=new class();
下边在用class_exist的时候肯定为true
系统中存在此对象。我想问有没直接得到此对象实例的功能。上边实例化过了。
比如:
new xxx();
if(class_exist(xxx))
$cls=此处返回xxx类。而不是重新new一个。
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;
}
}
实例化一个类,就是开辟了一个地址空间,这个地址是根据目前内存使用情况随机取的,所以,在没有记录这个地址的情况下,想获取也是需要开销的。最保险就是做工厂或者类本身做单例了。
程序有个作用域的,在同作用域中,没必要这要做。不同作用域中这么做了,就违反语言本身设计初衷了。