//$king 是一个King的对象,很大,之所以很大是因为他的数组占很大内存。
//所以 King 和lllnews之间。从考虑资源使用效率、面向对象结构化等方面考虑,以下哪种方式更好
class lllnews
{
var $king;

public function __construct() //方式1:引用了$king对象为成员变量。//这个效率应该很高,但是前提是不是需要$king的存在呢?
{
global $king;
$this->king=&$king;
}
public function __construct()//方式2:传值了$king对象为成员变量。//比传值增加了资源耗费吧?
{
global $king;
$this->king=$king;
}
public function __construct()//方式3:临时生成了$king对象,我想效率应该是个问题。但是不用考虑$king对象改名的问题。
{
$this->king=new King();
}
public function showdemo()//方式1、2、3:使用成员变量
{
$sql="select * from %s_news limit 2";
$rs=$this->king->db->getRows($sql) or $this->king->db->showerr();//查询 或 失败后报错
var_dump($rs);
}
public function showdemo2()//方式4:直接调用全局对象$king。效率应该没问题, 麻烦的是每个方法都得使用global 对象名。如果king对象名修改后,再一个个修改lllnews的方法就麻烦了。
{
global $king;
$sql="select * from %s_news limit 2";
$rs=$king->db->getRows($sql) or $king->db->showerr();//查询 或 失败后报错
var_dump($rs);
}
}

解决方案 »

  1.   

    king 定义成单例(singleton)模式就可以了!class king {
        public static function getInstance() {
            static $instance;
            if(!$instance) {
                $instance = new king();
            }
            return $instance;
        }
        省略其他……
    }其他各处使用的话只要用king::getInstance()另外现在的所有对象的传递都是引用传递,除非你明确了调用clone对象!方式1、2一样,方式3其实如果不考虑第一次初始化的情况(可以靠单例模式解决,早晚都要初始化一次)和方式1、2几乎一样!另外,极其不推荐代码中global到处存在,好的设计完全可以避免n多global!
      

  2.   


    你的回答让我豁然开朗。请问,为什么方式3多次new,效率还和第1、2几乎一样?
      

  3.   

    是不是静态方法和变量,无论是否new,都会初始化,从而new。如果这样,很多类的时候是不是会自动new出很多资源。
      

  4.   

    是不是构造函数中也可以if (null) {return $s= new class}return $s;?利用构造函数单例?
      

  5.   


    这样会引起混淆,本身new 就是告诉使用者会产生一个新的对象实例!