2011-02-11 3 views
0
 self::$currentend = $cfp; 
     self::$currentend = &$cfp->next; 
     self::$basisend = $cfp; 
     self::$basisend = &$cfp->bp; 

무엇이 발생합니까?이 PHP 코드의 목적은 무엇입니까?

발견 된 here.

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

항상

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

왜 여분의 라인으로 평가하기 때문에

UPDATE

내 질문은?

+0

클래스의 여러 정적 속성 값을 설정합니다. 하지만 전혀 컨텍스트가 없으면 더 많은 것을 말하기는 어렵습니다. –

+0

아무 의미가 있습니다. 더 많은 코드를 붙여 넣을 수 있습니까? – BoltClock

+0

미안하지만 ... 내 대리석은 지금 청소 중입니다 ... 더 많은 코드! ;-) – thedom

답변

1
귀하의 PHP 코드는

C->이 코드가 포함 된 LEMON 파서 생성기의 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; 
} 

는 원래 C.에 있었기 때문에 그것은 PHP에서의를 원래 C는 currentend 포인터를 통해 (가리키는 메모리가 아닌 다른 곳에서 할당 된 메모리, 아마도 가비지 포함) 내용을 바꾼 다음 cfp->next (0struct node)이 가리키는 포인터를 currentend 포인터로 업데이트합니다. 이리, 그래서 다른 루틴이 나중에 메모리를 할당 할 것이라고 생각하는 이유입니다).

즉, "마지막 항목"에 대한 포인터를 유지하면서 struct rule의 목록 끝에 새 struct rule을 추가합니다. (글쎄, 끝을 넘어 항목.다음 마지막 엔트리는 일단 존재하면 그 곳으로 갈 것입니다. 이 모든 것이 O (1) 연산의 끝 부분에 액세스하여 목록 추가 작업을 향상시키는 데 적합합니다.

1

나는 그에서 무엇 아무 생각, 그것은 이상한 보지 않는다, 그러나 나는 설명 할 수 :

자체 :: 현재의 객체/클래스의 클래스를 의미합니다.

$ currentend & $ basisend는 변수 이름을 저장하는 변수이다 - 즉, 코드는 다음과 인 경우 :

$currentend = bla1; 
$currentend = bla2; 

다음은 본질적로 평가

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

그래서 어떤 값 뒤에 $ currentend & $ basisend는 현재 클래스 내의 정적 변수를 참조합니다.

&은 참조 연산자입니다. 기본적으로 변수를 복사하지 않고 다른 변수가 참조하는 변수를 "공유"한다는 의미입니다. 사실 변수에 포인터를 할당하는 것.

그 외에도 나는 그게 무엇인지 또는 목적이 무엇인지 모릅니다. 그러나 그것은 우스워 보인다.

1

코드는 모두 위에서 언급 한 것처럼 불완전하지만 의심스러운 PHP_ParserGenerator의 배 구성과 같습니다.

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; 
} 

코드를 자세히 보면이 비슷한 것을 알 수 있습니다.

+0

'self :: $ currentend'를 두 번 연속 설정하는 이유는 무엇입니까? – yoyo