>  기사  >  백엔드 개발  >  PHP 매직 메소드_php 스킬 사용법에 대한 자세한 설명

PHP 매직 메소드_php 스킬 사용법에 대한 자세한 설명

WBOY
WBOY원래의
2016-05-16 19:58:33988검색

PHP에서는 두 개의 밑줄 __로 시작하는 메소드를 매직 메소드라고 합니다. 이러한 메소드는 PHP에서 결정적인 역할을 합니다. 마법의 방법은 다음과 같습니다:

  • __construct(), 클래스 생성자
  • __destruct(), 클래스 소멸자
  • __call(), 객체에서 액세스할 수 없는 메서드를 호출할 때 호출됩니다.
  • __callStatic(), 정적 모드에서 액세스할 수 없는 메서드를 호출할 때 호출됩니다.
  • __get(), 클래스의 멤버 변수를 얻을 때 호출됨
  • __set(), 클래스의 멤버 변수 설정 시 호출
  • __isset(), 액세스할 수 없는 속성에 대해 isset() 또는 empty()가 호출될 때 호출됨
  • __unset(), 액세스할 수 없는 속성에 대해 unset()이 호출될 때 호출됩니다.
  • __sleep(), serialize() 실행 시 이 함수가 먼저 호출됩니다
  • __wakeup(), unserialize() 실행 시 이 함수가 먼저 호출됩니다
  • __toString(), 클래스를 문자열로 처리할 때의 응답 방식
  • __invoke(), 함수를 호출하여 객체를 호출할 때의 응답 메서드
  • __set_state(), 이 정적 메서드는 클래스를 내보내기 위해 var_export()가 호출될 때 호출됩니다.
  • __clone(), 객체 복사가 완료되면 호출됩니다.

__construct() 및 __destruct()

생성자와 소멸자는 객체가 생성되고 소멸될 때 호출되므로 익숙해야 합니다. 예를 들어 파일을 열고, 객체가 생성될 때 열고, 객체가 죽을 때 닫아야 합니다

<&#63;php 
class FileRead
{
 protected $handle = NULL;

 function __construct(){
  $this->handle = fopen(...);
 }

 function __destruct(){
  fclose($this->handle);
 }
}
&#63;>

이 두 메소드는 상속될 때 확장될 수 있습니다. 예를 들면 다음과 같습니다.

<&#63;php 
class TmpFileRead extends FileRead
{
 function __construct(){
  parent::__construct();
 }

 function __destruct(){
  parent::__destruct();
 }
}
&#63;>

__call() 및 __callStatic()

이 두 메소드는 객체에서 접근할 수 없는 메소드가 호출될 때 호출되며 후자가 정적 메소드입니다. 이 두 메서드는 변수 메서드(변수 함수) 호출에 사용될 수 있습니다.

<&#63;php
class MethodTest 
{
 public function __call ($name, $arguments) {
  echo "Calling object method '$name' ". implode(', ', $arguments). "\n";
 }

 public static function __callStatic ($name, $arguments) {
  echo "Calling static method '$name' ". implode(', ', $arguments). "\n";
 }
}

$obj = new MethodTest;
$obj->runTest('in object context');
MethodTest::runTest('in static context');
&#63;>

__get(), __set(), __isset() 및 __unset()

이 두 함수는 클래스의 멤버 변수를 가져오거나 설정할 때 호출됩니다. 예를 들어 객체 자체의 멤버 변수 대신 객체 변수를 다른 배열에 저장합니다

<&#63;php 
class MethodTest
{
 private $data = array();

 public function __set($name, $value){
  $this->data[$name] = $value;
 }

 public function __get($name){
  if(array_key_exists($name, $this->data))
   return $this->data[$name];
  return NULL;
 }

 public function __isset($name){
  return isset($this->data[$name])
 }

 public function unset($name){
  unset($this->data[$name]);
 }
}
&#63;>

__sleep() 및 __wakeup()

serialize()와 unserialize()를 실행하면 이 두 함수가 먼저 호출됩니다. 예를 들어, 객체를 직렬화할 때 객체에 데이터베이스 링크가 있습니다. 직렬화 해제 중에 링크 상태를 복원하려면 이 두 함수를 재구성하여 링크를 복원할 수 있습니다. 예시는 다음과 같습니다.

<&#63;php
class Connection 
{
 protected $link;
 private $server, $username, $password, $db;

 public function __construct($server, $username, $password, $db)
 {
  $this->server = $server;
  $this->username = $username;
  $this->password = $password;
  $this->db = $db;
  $this->connect();
 }

 private function connect()
 {
  $this->link = mysql_connect($this->server, $this->username, $this->password);
  mysql_select_db($this->db, $this->link);
 }

 public function __sleep()
 {
  return array('server', 'username', 'password', 'db');
 }

 public function __wakeup()
 {
  $this->connect();
 }
}
&#63;>

__toString()

객체를 문자열로 처리할 때의 응답 방식입니다. 예를 들어, echo $obj를 사용하여

객체를 출력합니다.
<&#63;php
// Declare a simple class
class TestClass
{
 public function __toString() {
  return 'this is a object';
 }
}

$class = new TestClass();
echo $class;
&#63;>

이 메서드는 문자열만 반환할 수 있으며 이 메서드에서는 예외가 발생할 수 없습니다. 그렇지 않으면 치명적인 오류가 발생합니다.

__invoke()

함수를 호출하여 객체를 호출할 때의 응답 방법입니다. 다음과 같습니다

<&#63;php
class CallableClass 
{
 function __invoke() {
  echo 'this is a object';
 }
}
$obj = new CallableClass;
var_dump(is_callable($obj));
&#63;>

__set_state()

이 정적 메서드는 클래스를 내보내기 위해 var_export()가 호출될 때 호출됩니다.

<&#63;php
class A
{
 public $var1;
 public $var2;

 public static function __set_state ($an_array) {
  $obj = new A;
  $obj->var1 = $an_array['var1'];
  $obj->var2 = $an_array['var2'];
  return $obj;
 }
}

$a = new A;
$a->var1 = 5;
$a->var2 = 'foo';
var_dump(var_export($a));
&#63;>

__clone()

오브젝트 복사가 완료되면 호출됩니다. 예를 들어, 디자인 패턴 및 PHP 구현에 대한 자세한 설명: 싱글톤 모드 문서에 언급된 싱글톤 모드 구현 방법은 이 기능을 사용하여 개체가 복제되는 것을 방지합니다.

<&#63;php 
public class Singleton {
 private static $_instance = NULL;

 // 私有构造方法 
 private function __construct() {}

 public static function getInstance() {
  if (is_null(self::$_instance)) {
   self::$_instance = new Singleton();
  }
  return self::$_instance;
 }

 // 防止克隆实例
 public function __clone(){
  die('Clone is not allowed.' . E_USER_ERROR);
 }
}
&#63;>

마법 상수

PHP의 대부분의 상수는 변경되지 않지만 코드에서 위치가 변경되면 변경되는 8개의 상수가 있습니다. 이 8개의 상수를 매직 상수라고 합니다.

  • __LINE__, 파일의 현재 줄 번호
  • __FILE__, 파일의 전체 경로 및 파일 이름
  • __DIR__, 파일이 있는 디렉터리
  • __FUNCTION__, 함수명
  • __CLASS__, 클래스 이름
  • __TRAIT__, 특성의 이름
  • __METHOD__, 클래스의 메소드 이름
  • __NAMESPACE__, 현재 네임스페이스의 이름

이러한 마법 상수는 현재 환경 정보를 얻거나 로그를 기록하는 데 자주 사용됩니다.

위 내용은 이 글의 전체 내용입니다. 모든 분들의 공부에 도움이 되었으면 좋겠습니다.

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