찾다

 >  Q&A  >  본문

__set()의 연산 과정은 무엇입니까?

클래스 돔{
비공개 $age;
공개 함수 __construct($age){

$this->age =$age;
}
공개 함수 __set($name,$value){

if($name =='age')
               {거짓 반환;}                                                                              > ~                      . 두 경우 모두 출력 결과는 기본값 24여야 하지만

echo $obj->의 결과는 ;age=25는 25입니다. $obj->age=26; echo $obj->age; 이 문장에는 문제가 없나요?


葫芦娃平衡盘葫芦娃平衡盘2663일 전1283

모든 응답(2)나는 대답할 것이다

  • DayDayUp

    DayDayUp2017-08-12 16:38:41

    class demo{
        private $age;
        public function __construct($age){
                $this->age =$age;
        }
        public function __set($name,$value){
            if($name =='age'){
                return false;
            }       
            return $this->$name=$value;
        }   
    }
        $obj =new demo(24);
        echo $obj->age=25;
        $obj->age=26;
        echo $obj->age;

    귀하의 코드에서는 두 번째 에코가 실행되어서는 안 됩니다. 전체 코드를 게시하지 않은 이유는 개인 속성에 액세스할 수 없다는 메시지가 표시되기 때문입니다.

    두 출력 결과의 차이점은 작성 방식 때문입니다. echo, echo a = 3 이렇게 작성하면 할당문이 실행되지만 할당 성공 여부에 관계없이 등호 오른쪽의 숫자가 화면에 출력됩니다

    1. >age=25; set 메소드를 실행하면 name이 age와 동일하다는 것을 확인하고 false를 반환하므로 age 속성 값은 수정되지 않습니다. 하지만 여러분이 쓰는 방식으로는 화면의 등호 오른쪽에 25가 출력됩니다.

    2. 두 번째 방법은 할당문을 실행한 다음 false를 반환하는 일반적인 방식입니다. , age 값을 수정하지 않고 출력하면 age 속성 값이 여전히 24


    입니다.

    회신하다
    1
  • 葫芦娃平衡盘

    알겠습니다. 정말 감사합니다.

    葫芦娃平衡盘 · 2017-08-12 18:18:18
  • DayDayUp

    DayDayUp2017-08-12 16:00:34

    echo $obj->age=25 이 문장은 잘못되었습니다. 클래스의 값을 변경하지 않았습니다.

    1. 설정 방법에 문제가 있는 것 같습니다. else 문이 빠진 것 같습니다

    2. 비공개 속성을 읽으려면 다른 get 메소드를 작성해야 합니다

    if($name =='age')
            {return false;}  //没有else     
    return $this->$name=$value;
        }   
     }
         
       //正确代码
       public function __set($name,$value){
            if($name == 'age'){
                echo 'age不允许修改';
            }else{      
                return $this->$name = $value;
            } 
        } 
        
        public function __Get($name){
                return $this->$name;
        }


    회신하다
    0
  • 취소회신하다