php---매직 방법( tostring(),set_state())

2978 단어
다음 코드를 보십시오.
class Test{
    public $a;
    public function func(){
        echo '        ';
    }
}
$test = new Test();
echo $test;

출력: Catchable fatal error: Object of class Test could not be converted to string in G:\xampp\htdocs\ww\testclass.php on line 10
만약 우리가 대상을 인쇄하려면 을 호출해야 한다toString()이라는 마술 방법을 추가했습니다.toString () 은 틀리지 않을 것입니다.
class Test{
    public $a;
    public function func(){
        echo '        ';
    }
    
    public function __toString(){
        return "           ";
    }
}
$test = new Test();
echo $test;

출력:
대상을 인쇄하는 방법
__set_state()
이 방법도 사실 비교적 간단하다. 바로varexport()의 콜백 함수입니다.다음 코드를 보세요.
class Test{
    public $a;
    public function func(){
        echo '       ';
    }
}
$test = new Test();
var_export($test);

출력:
Test::__set_state(array( 'a' => NULL, ))
주의 a는 NULL입니다. 값이 없습니다. 다음은 제가 메모를 쓰겠습니다
class Test{
    public $a;
    static function __set_state($array) {//       ,       
        $tmp = new Test();
        $tmp->a = 'abc';//    
        return $tmp;//        ,         
    }
    
}
$test = new Test();
eval('$b = '.var_export($test,true).';');
var_dump($b);

출력의 내용은 다음과 같습니다.
object(Test)#2 (1) { ["a"]=> string(3) "abc"}
이게 무슨 소용이냐고요?그다지 쓸모가 없는데, 가장 큰 작용은 대상을 복제할 수 있다.코드만 바꾸면 돼.
class Test{
    public $a;
    static function __set_state($array) {//       ,       
        $tmp = new Test();
        $tmp->a = $array['a'];//    
        return $tmp;//        ,         
    }
    
}
$test = new Test();
$test->a = '  $test';
eval('$b = '.var_export($test,true).';');
var_dump($b);

출력:
object(Test)#2 (1) {[a]=> string(11) "나는 $test"}
누가 또 물어볼 거예요. 클론은 직접 클론() 방법으로 할 수 있어요!!좋습니다. 이런 상황을 어떻게 복제하는지 여쭙겠습니다. 코드를 살펴보겠습니다.
class Test{
    public $a;
    static function __set_state($array) {//       ,       
        $tmp = new Test();
        $tmp->a = str_replace('$test','$b',$array['a']);//    
        return $tmp;//        ,         
    }
    
}
$test = new Test();
$test->a = '  $test';
eval('$b = '.var_export($test,true).';');
var_dump($b);

그러면 우리는 $test를 복제했지만 그에 상응하는 변화를 했다.
어떤 사람들은 네가 왜 을 쓰지 않느냐고 묻는다클론이 리셋을 할까요?이것이 바로 내가 말하고 싶은 부분이다. 개인적으로clone()에 없음set_ 때문에 state ()가 강력합니다.clone () 는 받아들일 수 있는 매개 변수가 없어서 '진화' 의 범위를 제한합니다. 예를 들어 설명하겠습니다.
class Test{
    public $a;
    function __clone(){
        $this->a = str_replace('a','  a',$this->a);//        a
    }
    
}
$test = new Test();
$test->a = '  a';
$b = clone $test;
var_dump($b);

결과 출력:
object(Test)#2 (1) {[a]=> string(13) "나는 클론 a"}
 
 
 

좋은 웹페이지 즐겨찾기