>  기사  >  백엔드 개발  >  PHP의 일반적인 매직 메소드 함수 및 사용법

PHP의 일반적인 매직 메소드 함수 및 사용법

不言
不言원래의
2018-07-05 11:35:502499검색

이 글은 주로 PHP의 일반적인 매직 메소드의 기능과 사용법을 소개합니다. 이제는 모든 사람과 공유합니다. 도움이 필요한 친구들은 이를 참조할 수 있습니다.

개요

객체 지향 프로그래밍에서는 PHP를 사용합니다. 프로그래밍에 많은 편의를 제공하는 일련의 매직 메소드를 제공합니다. PHP의 매직 메소드는 일반적으로 __(두 개의 밑줄)로 시작하고 명시적인 호출이 필요하지 않지만 특정 조건에 의해 트리거됩니다.

시작하기 전에

PHP의 매직 메서드를 요약하기 전에 이후 예제에서 사용할 두 개의 클래스를 정의해 보겠습니다.

<?php
class Device{    
public $name,$battery,$data = [],$connection;    
protected function connect(){        
$this->connection = &#39;resource&#39;;        
echo $this->name.&#39;connected&#39;.PHP_EOL;
    }    
    protected function disconnect(){       
    $this->connection = null;        
    echo $this->name.&#39;disconnected&#39;.PHP_EOL;
    }
}

Device 클래스에는 네 개의 멤버 속성과 두 개의 멤버 메서드가 있습니다.

<?php 

class Battery{    
private $charge = 0;    
public function setCharge($charge){        
$charge = (int)$charge;        
if($charge < 0){            
$charge = 0;
        }else if($charge > 100){            
        $charge = 100;
        }        $this->charge = $charge;
    }
}

Battery 클래스에는 하나의 멤버 속성과 하나의 멤버 메서드가 있습니다.

생성자 및 소멸자

생성자와 소멸자는 객체가 생성되고 소멸될 때 각각 호출됩니다. 개체가 "파괴"되면 개체에 대한 참조가 없음을 의미합니다. 예를 들어 개체를 참조하는 변수가 삭제(설정 해제)되거나 다시 할당되거나 스크립트 실행이 종료되면 소멸자가 호출됩니다.

__construct()

__construct() 생성자는 단연 가장 일반적으로 사용되는 함수입니다. 객체를 생성할 때 생성자에서 일부 초기화 작업을 수행할 수 있습니다. 인스턴스화할 때 해당 매개변수 수가 전달되는 한 생성자에 대한 매개변수를 원하는 수만큼 정의할 수 있습니다. 생성자에서 예외가 발생하면 객체가 생성되지 않습니다.

<?php
class Device{    
public $name,$battery,$data = [],$connection;    
public function __construct(Battery $battery,$name){        
$this->battery = $battery;        
$this->name = $name;        
$this->connect();
    }    protected function connect(){        
    $this->connection = &#39;resource&#39;;        
    echo $this->name.&#39;connected&#39;.PHP_EOL;
    }    protected function disconnect(){        
    $this->connection = null;        
    echo $this->name.&#39;disconnected&#39;.PHP_EOL;
    }
}

위 예제 코드에서 Device 클래스의 생성자는 멤버 속성에 값을 할당하고 connect() 메서드를 호출합니다.

생성자를 비공개 메서드로 선언하면 단순 패턴에서 자주 사용되는 클래스 외부에서 객체가 생성되는 것을 방지할 수 있습니다.

__desctruct()

소멸자는 일반적으로 객체가 소멸될 때 호출됩니다. 소멸자는 매개변수를 받지 않습니다. 데이터베이스 연결 닫기 등 일부 정리 작업은 소멸자에서 수행되는 경우가 많습니다.

__get()

존재하지 않는 속성에 액세스하려고 하면 마법 메서드 __get()이 호출됩니다. 액세스된 속성의 이름을 나타내는 매개변수를 수신하고 속성의 값을 반환합니다. 위의 Device 클래스에는 다음 코드와 같이 여기에서 역할을 하는 데이터 속성이 있습니다.

<?php 

class Device{    
public $name,$battery,$data = [],$connection;    
public function __construct(Battery $battery,$name){        
$this->battery = $battery;        
$this->name = $name;        
$this->connect();
    }    protected function connect(){        
    $this->connection = &#39;resource&#39;;        
    echo $this->name.&#39;connected&#39;.PHP_EOL;
    }    
    protected function disconnect(){        
    $this->connection = null;        
    echo $this->name.&#39;disconnected&#39;.PHP_EOL;
    }
}
$battery = new Battery();
$device = new Device($battery,&#39;mac&#39;);
echo $device->aaa; //Notice: Undefined property: Device::$aaa
<?phpheader("Content-type: text/html; 
charset=utf-8");
class Device{    
public $name,$battery,$data = [],$connection;   
public function __construct(Battery $battery,$name){        
$this->battery = $battery;        
$this->name = $name;        
$this->connect();
    }    
    public function __get($name){        
    if(array_key_exists($name,$this->data)){            
    return $this->data[$name];
        }        
        return &#39;属性不存在&#39;;
    }    
    protected function connect(){        
    $this->connection = &#39;resource&#39;;        
    echo $this->name.&#39;connected&#39;.PHP_EOL;
    }    protected function disconnect(){        
    $this->connection = null;        
    echo $this->name.&#39;disconnected&#39;.PHP_EOL;
    }
}$battery = new Battery();
$device = new Device($battery,&#39;mac&#39;);
echo $device->aaa; //macconnected 属性不存在

이 매직 메소드에 가장 일반적으로 사용되는 위치는 "읽기 전용" 속성을 생성하여 액세스를 확장하는 것입니다. 제어. 위의 Battery 클래스에는 $charge라는 개인 속성이 있습니다. __get() 매직 메서드를 통해 이 속성을 확장할 수 있지만 클래스 외부에서는 수정할 수 없습니다. 코드는 다음과 같습니다:

<?php 

class Battery {    
private $charge = 0; 
    public function  __get($name) {        
    if(isset($this->$name)) {            
    return $this->$name;
        }        
        return null;
    }
}

__set()

__set() 접근할 수 없는 속성을 수정하려고 하면 매직 메서드가 호출됩니다. 이 메서드는 속성 이름을 나타내는 매개변수와 속성을 나타내는 매개변수를 받습니다. 속성의 값. 샘플 코드는 다음과 같습니다.

<?php
header("Content-type: text/html; charset=utf-8");
class Device{    
public $name,$battery,$data = [],$connection;    
public function __construct(Battery $battery,$name){        
$this->battery = $battery;        
$this->name = $name;       
$this->connect();
    }    
    public function __get($name){        
    if(array_key_exists($name,$this->data)){            
    return $this->data[$name];
        }        
        return &#39;属性不存在&#39;;
    }    
    public function __set($name,$value){        
    $this->data[$name] = $value;
    }    protected function connect(){        
    $this->connection = &#39;resource&#39;;        
    echo $this->name.&#39;connected&#39;.PHP_EOL;
    }    protected function disconnect(){        
    $this->connection = null;        
    echo $this->name.&#39;disconnected&#39;.PHP_EOL;
    }
}$battery = new Battery();
$device = new Device($battery,&#39;mac&#39;);
$device->aaa = &#39;哈哈&#39;;
echo $device->aaa; //macconnected 哈哈

__isset()

__isset() 접근할 수 없는 속성에 대해 isset() 메서드가 호출되면 매직 메서드가 호출됩니다. 이 메서드는 속성의 이름을 나타내는 매개변수를 받습니다. 속성이 존재하는지 여부를 나타내는 부울 값을 반환해야 합니다. 코드는 다음과 같습니다.

<?php
class Device{    
private function __isset($name){        
return array_key_exists($name,$this->data);
    }

객체의 멤버가 공개인 경우 isset() 함수를 직접 사용할 수 있습니다. 비공개 멤버 속성인 경우 클래스

__unset()

__unset()에 __isset() 메서드를 추가해야 합니다. 액세스할 수 없는 속성을 삭제하기 위해 unset() 함수가 호출될 때 매직 메서드가 호출됩니다. 속성이 호출되면 속성의 이름을 나타내는 매개변수를 받습니다.

위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되었으면 좋겠습니다. 더 많은 관련 내용은 PHP 중국어 홈페이지를 주목해주세요!

관련 권장 사항:

PHP의 매직 상수(변수), 매직 메서드(함수) 및 슈퍼전역 변수 소개

위 내용은 PHP의 일반적인 매직 메소드 함수 및 사용법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.