매직메소드란?
PHP에서는 일련의 매직 메소드가 제공됩니다. 이러한 매직 메소드는 프로그래밍에 많은 편의를 제공합니다. PHP에서는 두 개의 밑줄 __로 시작하는 메소드를 매직 메소드라고 합니다. 매직 메서드는 명시적으로 호출할 필요가 없지만 특정 조건에 의해 트리거됩니다. 이 장에서는 PHP에서 제공하는 매직 메소드에 대해 간략하게 소개합니다.
PHP의 매직 메소드는 다음과 같습니다:
|
설명 | ||||||||||||||||||||||||||||||
__construct() | 클래스 생성자 | ||||||||||||||||||||||||||||||
__destruct() | 클래스 소멸자 | ||||||||||||||||||||||||||||||
__call() | 객체에서 액세스할 수 없는 메소드가 호출될 때 호출됩니다. | ||||||||||||||||||||||||||||||
__callStatic() | 정적 모드에서 액세스할 수 없는 메소드를 호출할 때 호출됨 | ||||||||||||||||||||||||||||||
__get() | 클래스의 멤버 변수를 얻을 때 호출됨 | ||||||||||||||||||||||||||||||
__set() | 클래스의 멤버 변수 설정 시 호출 | ||||||||||||||||||||||||||||||
__isset() | 액세스할 수 없는 속성에 대해 isset() 또는 empty()가 호출될 때 호출됩니다. | ||||||||||||||||||||||||||||||
__unset() | 설정 해제 시 호출( )은 액세스할 수 없는 속성에 대해 호출됩니다. | ||||||||||||||||||||||||||||||
__sleep() | serialize() 실행 시 이 함수가 먼저 호출됩니다 | ||||||||||||||||||||||||||||||
unserialize()를 실행할 때 이 함수가 먼저 호출됩니다 | |||||||||||||||||||||||||||||||
__toString() | 클래스가 문자열로 처리될 때의 응답 방법 | ||||||||||||||||||||||||||||||
__invoke () | 함수를 호출하여 객체를 호출할 때의 응답 방법 td> | ||||||||||||||||||||||||||||||
__set_state() | 이 정적 메서드는 클래스를 내보내기 위해 var_export()를 호출할 때 호출됩니다. | ||||||||||||||||||||||||||||||
__clone() | 객체 복사가 완료되면 호출 |
위 표의 "__"는 "_"이 아닌 두 개의 밑줄입니다.
이러한 매직 메서드의 실제 적용을 별도로 살펴보겠습니다
__construct() 및 __destruct()
생성자와 소멸자는 익숙해야 하며 객체가 생성되고 소멸될 때 호출됩니다. 예를 들어, 파일을 열고, 객체가 생성될 때 열고, 객체가 소멸될 때 닫아야 합니다.
<?php class FileRead { protected $handle = NULL; function __construct(){ $this->handle = fopen(...); } function __destruct(){ fclose($this->handle); } } ?>
이 두 메서드는 상속될 때 확장될 수 있습니다. 예:
<?php class TmpFileRead extends FileRead { function __construct(){ parent::__construct(); } function __destruct(){ parent::__destruct(); } } ?>
__call() 및 __callStatic()
이 두 메서드는 개체에서 액세스할 수 없는 메서드를 호출할 때 호출되며 후자가 정적 메서드입니다. 이 두 메서드는 변수 메서드(변수 함수) 호출에 사용될 수 있습니다.
<?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'); ?>
__get(), __set(), __isset() 및 __unset()
이 두 함수는 클래스의 멤버 변수를 가져오거나 설정할 때 호출됩니다. 예를 들어, 실행 시 객체 자체의 멤버 변수
<?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]); } } ?>
__sleep() 및 __wakeup()
대신 다른 배열에 객체 변수를 저장합니다. serialize() 및 unserialize()를 실행하면 이 두 함수가 먼저 호출됩니다. 예를 들어, 객체를 직렬화할 때 객체에 데이터베이스 링크가 있습니다. 역직렬화 중에 링크 상태를 복원하려면 이 두 함수를 재구성하여 링크를 복원할 수 있습니다.
예제는 다음과 같습니다.
<?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(); } } ?>
__toString()
객체를 문자열로 처리할 때의 응답 방식입니다. 예를 들어,
<?php // Declare a simple class class TestClass { public function __toString() { return 'this is a object'; } } $class = new TestClass(); echo $class; ?>
객체를 출력하려면 echo $obj;를 사용하세요. 이 메서드는 문자열만 반환할 수 있으며 이 메서드에서는 예외가 발생할 수 없습니다. 그렇지 않으면 치명적인 오류가 발생합니다.
__invoke()
함수를 호출하여 객체를 호출할 때의 응답 방식입니다. 다음과 같습니다
<?php class CallableClass { function __invoke() { echo 'this is a object'; } } $obj = new CallableClass; var_dump(is_callable($obj)); ?>
__set_state()
클래스를 내보내기 위해 var_export()를 호출할 때 이 정적 메서드가 호출됩니다.
<?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)); ?>
__clone()
객체 복사가 완료되면 호출됩니다. 예를 들어, 디자인 패턴에 대한 자세한 설명 및 PHP 구현: 싱글턴 모드 기사에서 언급된 싱글턴 모드 구현 방법에서 이 함수는 객체가 복제되는 것을 방지하는 데 사용됩니다.
<?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); } } ?>
추천 관련 기사:
위 내용은 PHP의 매직 메소드 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!