这个PHP代码的目的是什么?

时间:2011-02-11 09:24:09

标签: php code-analysis

        self::$currentend = $cfp;
        self::$currentend = &$cfp->next;
        self::$basisend = $cfp;
        self::$basisend = &$cfp->bp;

它做了什么?

找到here

更新

我的问题是从

开始
        self::$currentend = $cfp;
        self::$currentend = &$cfp->next;

始终评估为

        self::$currentend = &$cfp->next;

为什么额外的线?

3 个答案:

答案 0 :(得分:1)

我不知道那是什么,看起来很奇怪,但我可以解释一下:

self ::指当前对象/类的类。

$ currentend& $ basisend是存储变量名的变量 - 也就是说,如果代码是这样的:

$currentend = bla1;
$currentend = bla2;

然后它基本上评估为:

self::bla1 = $cfp;
self::bla1 =& $cfp->next;
self::bla2 = $cfp;
self::bla2 =& $cfp->bp;

无论$ currentend& $ basisend,它们引用当前类中的静态变量。

&是一个参考运算符。它基本上意味着您不想复制变量,而是“共享”由其他两个变量引用的变量。实际上,要为变量指定一个指针。

除此之外,我不知道那是什么或目的是什么。但它看起来很有趣。

答案 1 :(得分:1)

代码是不完整的,正如上面所说的那样,但它看起来像是PHP_ParserGenerator的Pear Config。

  static function Configlist_add($rp, $dot)
{
    $model = new PHP_ParserGenerator_Config;
    $model->rp = $rp;
    $model->dot = $dot;
    $cfp = self::Configtable_find($model);
    if ($cfp === 0) {
        $cfp = self::newconfig();
        $cfp->rp = $rp;
        $cfp->dot = $dot;
        $cfp->fws = array();
        $cfp->stp = 0;
        $cfp->fplp = $cfp->bplp = 0;
        $cfp->next = 0;
        $cfp->bp = 0;
        self::$currentend = $cfp;
        self::$currentend = &$cfp->next;
        self::Configtable_insert($cfp);
    }
    return $cfp;
}

我怀疑如果你进一步研究代码,你会发现对类似内容的引用。

答案 2 :(得分:1)

您的PHP代码是LEMON解析器生成器的C-> PHP端口,其中包含以下代码:

/* Add another configuration to the configuration list */
struct config *Configlist_add(rp,dot)
struct rule *rp;    /* The rule */
int dot;            /* Index into the RHS of the rule where the dot goes */
{
  struct config *cfp, model;

  assert( currentend!=0 );
  model.rp = rp;
  model.dot = dot;
  cfp = Configtable_find(&model);
  if( cfp==0 ){
    cfp = newconfig();
    cfp->rp = rp;
    cfp->dot = dot;
    cfp->fws = SetNew();
    cfp->stp = 0;
    cfp->fplp = cfp->bplp = 0;
    cfp->next = 0;
    cfp->bp = 0;
    *currentend = cfp;
    currentend = &cfp->next;
    Configtable_insert(cfp);
  }
  return cfp;
}

它在PHP中,因为它在原始C中。在原始C中,它通过currentend指针写入以替换它所指向的内容(在其他地方分配的内存,可能包含垃圾),然后它更新currentend指针以指向struct node所指向的cfp->next(这是0,这就是为什么我认为其他一些例程会分配以后的记忆)。

换句话说,它将新的struct rule附加到struct rule列表的末尾,同时保持指向“最后一个条目”的指针。 (好吧,一个超越结束的条目。一旦它存在,下一个最后一个条目将去的地方。所有这些都使得访问列表末尾的操作成为O(1),非常适合改进列表附加操作。 )