关于设置PHP类只有一次的方法的反馈

时间:2014-02-26 23:05:54

标签: php oop

并希望有效地与他们合作。这是我正在做的应用程序的前提:

  1. 我们只需要实例化一次类
  2. 我不一定知道该类是否已被实例化
  3. 如果我需要多次实例化一个类,我将有足够的常识不使用这个系统
  4. 该类可以在另一个类,函数等中调用,但一旦调用,我希望它可以在任何地方使用
  5. 这里说的是我正在研究的功能。它允许一次设置一个类,并且可以在任何地方全局使用。但它似乎非常笨拙,而且我认为必须有改进:

                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');
    

1 个答案:

答案 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 类创建这些?