2011-01-04 6 views
0

클래스 내에서 동일한 객체를 모두 가리켜 야하는 3 개의 배열 (인스턴스 변수로)이 있습니다. 첫 번째는 숫자 적으로 인덱스 된 배열이며, 일부 외부 함수에서 다시 가져옵니다. 두 번째 배열은 이름이 같은 객체를 인덱싱해야합니다. 다른 속성에 의해 세 번째. 이것은 이러한 속성을 통한 빠른 액세스를위한 것입니다. 요점은 객체를 액세스하고 수정하는 데 어떤 배열을 사용할지 상관 없습니다.서로 다른 색인을 붙인 PHP 배열을 동일한 객체를 가리키는 방법

그러나 그렇게 할 수는 없습니다. PHP 참조에 대해 알고 있습니다. Java 참조에 대해 알고 있습니다. 나는 C 포인터에 대해 알고 있지만 앰퍼샌드 (= &)를 배치하려고 할 때마다 그럴 수 없습니다.

class xxx { 

    private $objs; 
    private $objsByName; 

    public function __construct() { 

    $this->objs = getObjs(); 
    $this->objsByName = array(); 
    foreach($this->objs as $obj) { 
     $this->objsByName[$obj->getName()] = $obj; 
    } 
    } 

} 

내가 뭔가를 놓친 거지 = &

와 내가 교체 시도하지 않은 여기 곳은 =이 없다?

+0

StackOverflow에 오신 것을 환영합니다. {{}'도구 모음 버튼을 사용하여 소스 코드를 포맷 할 수 있습니다 (이번에는 도움이되었습니다). 귀하의 문제를 해결할 수있는 최선의 답을 * 수락 *으로 표시하는 것을 잊지 마십시오. –

답변

0

foreach 루프를이 루프로 바꿉니다.

for($i = 0 , $n = count($this->objs); $i < $n ; $i ++){ 

$this->objsByName[$this->objs[$i]->getName()] = &$this->objs[$i]; 

} 

이 문제 :

감사를 해결할 것입니다!

후세인.

0

PHP에서 개체는 항상 참조 (you cannot copy an object unless you use clone keyword)로 전달됩니다. 이 코드는 다음을 설명합니다.

<?php 

class AnObject{ 
    private $name; 
    public $count=0; 

    public function __construct($name){ 
     $this->name = $name; 
    } 

    public function getName(){ 
     return $this->name; 
    } 
} 

function getObjs(){ 
    return array(
     new AnObject('One'), 
     new AnObject('Two'), 
     new AnObject('Three'), 
    ); 
} 


class xxx { 

    private $objs; 
    private $objsByName; 

    public function __construct() { 

    $this->objs = getObjs(); 
    $this->objsByName = array(); 
    foreach($this->objs as $obj) { 
     $this->objsByName[$obj->getName()] = $obj; 
    } 
    } 

    public function alterAnObjectByName($name){ 
     $this->objsByName[$name]->count++; 
    } 

} 

$x = new xxx; 
var_dump($x); 
$x->alterAnObjectByName('Two'); 
var_dump($x); 

문제는 아마도 다른 곳에서 발생했을 것입니다.

0

마크 PHP 매뉴얼에서이 부분 : 배열이 참조되지 않는 http://php.net/manual/en/control-structures.foreach.php

는 foreach 문은 지정된 배열의 복사본이 아닌 배열 자체에서 작동합니다. foreach는 배열 포인터에 몇 가지 부작용이 있습니다. foreach 중에 또는 후에 배열 포인터를 다시 설정하지 않고 배열 포인터에 의존하지 마십시오.

그래서 $ obj는 사본입니다.

내가 후세인의 코드를 테스트하지 않은,하지만 좋은 옵션 :

0

PHP는 항상 쓰기 기능에 복사본을 사용처럼 보이는, 기회는 하나가 변경 될 때까지 객체가 동일하다고합니다.

오류를 방지하려면 배열 중 하나에 데이터가 포함되어 있고 나머지는 단지 색인이라고 말해야합니다.

색인을 사용하여 ID를 찾고 id로 색인 된 데이터 배열을 사용하여 데이터를 읽고 변경하십시오.

PHP5에서
0

당신이 foreach 루프 개체를 복제 할 수 있도록하기 위해 as 변수에 &를 추가 할 수 있습니다

foreach($this->objs as &$obj) { 
    $this->objsByName[$obj->getName()] = &$obj; 
} 

참조 : http://php.net/manual/en/control-structures.foreach.php

P/s의 : 나는 확실하지 해요 & 경우 foreach 몸 안쪽에 필요하거나 아닙니다 다만 안전하기 위하여 그것을 추가하십시오. 또는 제거하여 필요 여부를 확인할 수도 있습니다.

관련 문제