source

PHP 치명적 오류: 빈 속성에 액세스할 수 없습니다.

nicesource 2023. 9. 1. 21:05
반응형

PHP 치명적 오류: 빈 속성에 액세스할 수 없습니다.

처음입니다php코드 아래에서 실행했습니다.

<?php
class my_class{

    var $my_value = array();
    function my_class ($value){
        $this->my_value[] = $value;
    }
    function set_value ($value){
    // Error occurred from here as Undefined variable: my_value
        $this->$my_value = $value;

    }

}

$a = new my_class ('a');
$a->my_value[] = 'b';
$a->set_value ('c');
$a->my_class('d');

foreach ($a->my_value as &$value) {
    echo $value;
}

?>

아래 오류가 있습니다.뭐가 잘못됐나요?

Notice: Undefined variable: my_value in C:\xampp\htdocs\MyTestPages\f.php on line 15

Fatal error: Cannot access empty property in C:\xampp\htdocs\MyTestPages\f.php on line 15

잘못된 방법으로 숙박업소에 액세스합니다.와 함께$this->$my_value = ..구문: $my_value의 값 이름으로 속성을 설정합니다.당신이 원하는 것은$this->my_value = ..

$var = "my_value";
$this->$var = "test";

와 동일합니다.

$this->my_value = "test";

당신의 예에서 몇 가지를 고치기 위해, 아래 코드가 더 나은 접근법입니다.

class my_class {

    public  $my_value = array();

    function __construct ($value) {
        $this->my_value[] = $value;
    }

    function set_value ($value) {
        if (!is_array($value)) {
            throw new Exception("Illegal argument");
        }

        $this->my_value = $value;
    }

    function add_value($value) {
        $this->my_value = $value;
    }
}

$a = new my_class ('a');
$a->my_value[] = 'b';
$a->add_value('c');
$a->set_value(array('d'));

이렇게 하면 set_value를 호출할 때 my_value의 유형이 문자열이나 다른 형식으로 변경되지 않습니다.그러나 my_value의 값은 공개이므로 직접 설정할 수 있습니다.마지막 단계는 my_value를 비공개로 하고 getter/setter 메서드를 통해 my_value에만 액세스하는 것입니다.

첫째, var를 사용하여 변수를 선언하지 마십시오.

public $my_value;

그러면 다음을 사용하여 액세스할 수 있습니다.

$this->my_value;

그리고 아닌

$this->$my_value;

클래스의 변수에 액세스하려면 다음을 사용해야 합니다.$this->myVar대신에$this->$myvar.

그리고 다음 대신 액세스 식별자를 사용하여 변수를 선언해야 합니다.var.

여기에 있는 문서를 읽으십시오.

제가 당신의 코드에서 본 바와 같이, 당신은 PHP4에 기반한 PHP의 OOP에 대한 오래된 문서/튜토리얼을 따르고 있는 것 같습니다(OOP는 지원되지 않지만 어떻게든 간단한 방법으로 사용되도록 조정되었습니다). PHP5 이후 공식 지원이 추가되고 표기법이 기존에서 변경되었습니다.

다음 코드 검토를 참조하십시오.

<?php
class my_class{

    public $my_value = array();

    function __construct( $value ) { // the constructor name is __construct instead of the class name
        $this->my_value[] = $value;
    }
    function set_value ($value){
    // Error occurred from here as Undefined variable: my_value
        $this->my_value = $value; // remove the $ sign
    }

}

$a = new my_class ('a');
$a->my_value[] = 'b';
$a->set_value ('c'); // your array variable here will be replaced by a simple string 
// $a->my_class('d'); // you can call this if you mean calling the contructor 


// at this stage you can't loop on the variable since it have been replaced by a simple string ('c')
foreach ($a->my_value as &$value) { // look for foreach samples to know how to use it well
    echo $value;
}

?>

도움이 되길 바랍니다.

흥미로운 점:

  1. 배열을 선언했습니다.var $my_value = array();
  2. 가치 창출$a->my_value[] = 'b';
  3. 변수에 문자열을 할당했습니다.(그래서 더 이상 배열이 아닙니다)$a->set_value ('c');
  4. 더 이상 존재하지 않는 값을 배열로 푸시하려고 했습니다.(그것은 문자열입니다.$a->my_class('d');

그리고 당신의foreach더 이상 작동하지 않을 것입니다.

이렇게 하면 사용자 지정 속성 이름으로 새 개체를 만들 수 있습니다.

$my_property = 'foo';
$value = 'bar';
$a = (object) array($my_property => $value);

이제 다음과 같이 접근할 수 있습니다.

echo $a->foo;  //returns bar

저는 이 답변이 OP가 설명한 문제에 대한 직접적인 답변이 아니라는 것을 알고 있지만, 동일한 오류 메시지를 검색한 결과 이 질문을 발견했습니다.만약 누군가가 같은 일로 혼란스러워 할 경우를 대비해서 제 경험을 여기에 게시할 가치가 있다고 생각했습니다.

잘못된 형식으로 인해 문제의 오류가 발생할 수 있습니다.for연관 배열을 루프합니다.홧김에 => 대신 ->를 사용하고 있었습니다.for문:

        foreach ($object->someArray as $key->$val) {
            // do something
        }

물론, 나는 다음과 같이 했어야 했습니다.

        foreach ($object->someArray as $key=>$val) {
            // do something
        }

보고된 오류가 someArray 속성을 가리키는 것인 줄 알고 처음에는 혼란스러웠습니다!

언급URL : https://stackoverflow.com/questions/14920216/php-fatal-error-cannot-access-empty-property

반응형