在includes\modules\pages\子目录下的header_php.php中有很多$zco_notifier->notify这样的代码,跟踪代码,发现$zco_notifier对象最终是调用了includes\classes中的class.base.php.
class.base.php的具体代码如下:
<?php
class base {
  function attach(&$observer, $eventIDArray) {
    foreach($eventIDArray as $eventID) {
      $nameHash = md5(get_class($observer).$eventID);
      base::setStaticObserver($nameHash, array('obs'=>&$observer, 'eventID'=>$eventID));
    }
  }
  
  function detach($observer, $eventIDArray) {
    foreach($eventIDArray as $eventID) {    
      $nameHash = md5(get_class($observer).$eventID);
      base::unsetStaticObserver($nameHash);
    }
  }
  
  function notify($eventID, $paramArray = array()) {
    $observers = & base::getStaticObserver();
    if (!is_null($observers))
    {
      foreach($observers as $key=>$obs) {
        if ($obs['eventID'] == $eventID) {
          $obs['obs']->update($this, $eventID, $paramArray);
        }
      }
    }
  }
  function & getStaticProperty($var)
  {
    static $staticProperty;
    return $staticProperty;
  }
  function & getStaticObserver() {
    return base::getStaticProperty('observer');
  }
  function & setStaticObserver($element, $value)
  {
    $observer =  & base::getStaticObserver();
    $observer[$element] = $value;
  }
  function & unsetStaticObserver($element)
  {
    $observer =  & base::getStaticObserver();
    unset($observer[$element]);
  }
}
看了下程序流程,发现问题很多: notify方法调用了getStaticObserver(),getStaticObserver()调用了getStaticProperty(),而getStaticProperty()方法里面$staticProperty都没初始化,这样$observers==null是空的,那等于什么都没执行。
这个代码被调用的地方那么多,难道什么都没执行吗?很困惑,哪位大哥能解除我的疑惑啊!千恩万谢.

解决方案 »

  1.   

    static $staticProperty;
    表示$staticProperty是一个静态变量,它不需要用new来实例化,可以直接如下操作:
    print $base::$staticProperty;上面的代码不全吧?base类应该有一个类似setStaticProperty的函数。
      

  2.   

    base::setStaticObserver($nameHash, array('obs'=>&$observer, 'eventID'=>$eventID));
    不是还有这个吗?是对的哈。注意它里面的
    function & setStaticObserver($element, $value)
      {
      $observer = & base::getStaticObserver();
      $observer[$element] = $value;
      }
      

  3.   

    恩,& base::getStaticObserver();取的是$staticProperty的变量地址,
    $observer[$element] = $value;就是对$staticProperty进行赋值。