并希望有效地与他们合作。这是我正在做的应用程序的前提:
这里说的是我正在研究的功能。它允许一次设置一个类,并且可以在任何地方全局使用。但它似乎非常笨拙,而且我认为必须有改进:
function set_class_once(){
//example of most complex use: set_class_once('ClassA',$a [array], '$ginger', 'string');
$args=func_get_args();
if(!count($args))return;
$i=0;
$class='';
foreach($args as $n=>$v){
$i++;
if(!$class){
$class=$v; //always a string
unset($args[$n]); //remove from $args
continue;
}
if(is_array($v)){
$temp[$i]=$v;
$args[$n]='$temp['.$i.']'; //re-task
}else if(substr($v,0,1)=='$' && substr($v,1,7)!='GLOBALS'){
$args[$n]='$GLOBALS[\''.str_replace('$','',$v).'\']'; //variable
}else{
$args[$n]='\''.addslashes($v).'\'';
}
}
if(isset($GLOBALS[$class]) && is_object($GLOBALS[$class])){
//OK, we've instantiated that class
}else if(!class_exists($class)){
//fatal error
exit('Class '.$class.' does not exist');
}else{
print_r('$GLOBALS[$class]=new '.$class.'('.(!empty($args)?implode(',',$args):'').');').'<br>';
eval('$GLOBALS[$class]=new '.$class.'('.(!empty($args)?implode(',',$args):'').');');
}
}
class ClassC{
function ClassC($param1,$param2,$param3){
echo 'here is param1:<br>';
print_r($param1);
echo 'here is param2:<br>';
print_r($param2);
echo 'here is param3:<br>';
print_r($param3);
}
}
//with no params passed set_class_once('ClassA');
//with params passed:
$a=array(
'apple'=>'red',
'spinach'=>'green',
);
$ginger='fred backwards';
set_class_once('ClassC',$a,'$ginger','string');
答案 0 :(得分:-1)
为自己构建一个简单的单例,并为只想拥有1个实例的类扩展它:
class Singleton
{
public static function getInstance()
{
static $instance = null;
if (null === $instance) {
$instance = new static();
}
return $instance;
}
protected function __construct() { }
}
class ClassC extends Singleton
{
}
然后:
$object = ClassC::getInstance();
不确定我是否按照args逻辑进行操作,但我确信对于您正在尝试的内容有更好的做法。也许用 factory 类创建这些?