2011-04-01 5 views
0

아파치 2.2.14에서 CodeIgniter 2.0과 PHP5.3.2를 MySQL 5.1.48-community에서 사용하고 있습니다. 나는 다른 문제를 격리하기 위해 작은 테스트 컨트롤러를 만들었고 내 문제는 공공 변수 접근성 때문에 발생하는 것으로 나타났습니다. test1 또는 test2를 호출하면 다른 함수에 설정된 배열 요소의 값을 볼 수 없으므로 오류가 발생합니다. 아무도 왜 이것이 작동하지 않는지 알 수 있습니까? 그렇다면 클래스 전체 변수에 액세스 할 수 있어야하는 이유는 무엇입니까?클래스 함수에서 PHP5 클래스의 공용 변수 값에 액세스 할 수없는 이유는 무엇입니까?

감사합니다.

<?php 
class Test extends CI_Controller 
{ 
    public $data; 

    function __construct() 
    { 
    parent::__construct(); 
    $this->data = array(); 
    } 

    function index() 
    { 
    $this->data['test1'] = 'This is a test of class public variable access.<br />';   
    echo 'Class index() called.<br />'; 
    echo $this->data['test1']; 
    } 

    function test1() 
    { 
    $this->data['test2'] = 'This is a second test of the class public variable access.<br />';   
    echo 'Class test1 called.<br />'; 
    echo $this->data['test1']; 
    echo $this->data['test2']; 
    } 

    function test2() 
    { 
    echo 'The data array contains these two entries:<br />'; 
    echo $this->data['test1']; 
    echo $this->data['test2']; 
    } 
} 
/* End of file test.php*/ 
/* Location: */ 
+2

이 순서와 순서는 무엇이며 출력은 무엇입니까? – deceze

+1

오류 메시지의 정확한 표현은 무엇입니까? – Unsigned

+0

이 코드를 보지 못했습니다 ... CI_Controller 및 오류 메시지 세부 정보가 필요합니다. –

답변

1

오류는 코드에 있습니다. __construct() 클래스 인 경우 $this->dataarray()과 같습니다. 하늘의 배열 작동해야하는 유일한 행은 test1() 함수의 마지막 행입니다.

index()test1()에서 모든 에코 문을 제거하고 이것을 시도 :

function test2() 
    { 
     $this->index(); 
     $this->test1(); 
     echo 'The data array contains these two entries:<br />'; 
     echo $this->data['test1']; 
     echo $this->data['test2']; 
    } 

지금 당신이 그들을 정의하는 기능을 실행 하여 이러한 배열 키를 정의하기 때문에이 작동합니다.

클래스의 모든 메소드에서 액세스해야하는 경우 __construct에 정의하십시오.

+0

이 문제는, 실제로 Singleton 객체를 올바르게 생성하는 대신에 함수가 호출 될 때마다 CodeIgniter가 새로운 컨트롤러 객체 인스턴스를 생성한다는 사실에 기인합니다. 따라서 서로 다른 함수를 호출 할 때마다 다른 객체와 다른 데이터에서 작업하기 때문에 이전 함수에서 저장 한 데이터는 사용할 수 없습니다. – user686779

+0

당신이 당신 자신의 질문에 답하고 당신이 절대적으로 옳기 때문에 그것을 받아 들일 것을 제안합니다. –

+0

@user 나는 CI의 특성을 알지 못하지만 대개 요청 당 하나의 컨트롤러 조치 만이 있습니다. 특정 요청에서 여러 메소드를 명시 적으로 호출하지 않는 한, 이것은 싱글 톤 객체의 문제가 아니라 요청 간의 데이터 지속성 (PHP에서 이와 같이 발생하지 않음)과 관련됩니다. – deceze

관련 문제