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;
为什么额外的线?
答案 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),非常适合改进列表附加操作。 )