2010-02-19 2 views
0

저는 PHP와 프로그래밍에 익숙하지 않습니다. 나는 클래스 작성을 요구하는 PHP로 몇 가지 작업을 해왔다. 클래스 클래스의 속성 인 배열에서 클래스 메서드를 사용할 수 없다는 점을 제외하면 괜찮다. 프로젝트에 관계없이 작동하지 않는 것처럼 근본적으로 잘못된 것을해야합니다.PHP 클래스 함수는 배열을 변경하지 않습니다

여기에 필자가 작성한 예제가있다. (필자는 실제 프로젝트의 코드보다는 짧고 간단한 예제를 게시하는 것이 더 쉽다고 생각했다.

class Test { 
    public $testArray; 
    public $testInt; 

    public function __construct() { 
     $this->testArray = array(); 
     for ($i=1; $i<=20; $i++) { 
      $this->testArray[] = array(1, 2); 
     } 
     $this->testInt = 4; 
    } 

    public function testf() { 
     $this->testInt += 1; 
     foreach ($this->testArray as $n) { 
      $n[] = 3; 
     } 
    } 
} 

내가 무슨 일이 일어나고 있는지에서 인쇄를 얻을 수 있도록 내가 마지막에 몇 가지 코드를 추가하는 경우 :

$obj = new Test; 

echo 'Before function call:'; 
echo '<br />testArray:<br />'; 
foreach ($obj->testArray as $n) { 
    print_r($n); 
    echo '<br />'; 
} 
echo '<br />testInt: '; 
echo $obj->testInt; 
echo '<br />'; 
echo '<br />'; 
echo '<br />'; 

$obj->testf(); 

echo 'After function call:'; 
echo '<br />testArray:<br />'; 
foreach ($obj->testArray as $n) { 
    print_r($n); 
    echo '<br />'; 
} 
echo '<br />testInt: '; 
echo $obj->testInt; 
echo '<br />'; 

그런 다음 당신이 보는입니다 결국 어떤 기능 후에 testInt 변수의 변화를 부르는 , testArray은 그렇지 않습니다.

이 부분이 명확하지 않은 경우 알려주십시오. 이것은 나를 미치게 만들었다. 내 문제를 살펴 볼 시간을 내 주셔서 미리 감사드립니다.

답변

3

이 작업을 수행 할 때 :

foreach ($this->testArray as $n) { 
     $n[] = 3; 
    } 

당신은 testArray의 값을 수정하지 않는. 당신은 그들 사본을 만들고 있습니다. PHP에서 값을 다른 변수에 할당 할 때마다 값의 복사본을 만듭니다. (객체 정렬이 예외의 있습니다,하지만 여기에 해당하지 않습니다.) 원본을 수정하려면

,이 같은 자신의 변수 이름으로 그것을 참조해야합니다 :

foreach ($this->testArray as $index => $value) { 
     $this->testArray[$index][] = 3; 
    } 
+0

정말 고마워요, 정말 고마워요. –

4

당신은 foreach 루프에 약간의 무언가를 추가해야

foreach ($this->testArray as &$n) { 
     $n[] = 3; 
    } 

을해야한다고. & $ n은 배열 요소를 복사하는 것이 아니라 참조하는 것을 의미합니다. $ n []을 덮어 쓰려면 단지 $ n으로 변경하기를 원할 것입니다.

+0

벤, 당신의 우아한 대답은 내게 알려지지 않았습니다. D –

관련 문제