PHP에서 매직 메소드는 "__call()", "__get()", "__set()" 등과 같이 두 개의 밑줄 "__"로 시작하는 메소드를 나타냅니다. 매직 상수는 다음과 같이 변경되는 메소드를 나타냅니다. "__LINE__", "__FILE__" 등과 같이 코드 위치가 변경되면 변경되는 8개의 상수가 있습니다.
이 튜토리얼의 운영 환경: Windows 7 시스템, PHP 버전 7.1, DELL G3 컴퓨터
PHP는 두 개의 밑줄 __로 표시됩니다. code >처음에 나오는 메소드를 매직 메소드라고 하며, 이 메소드는 PHP에서 중추적인 역할을 합니다. 매직 메소드에는 <code>__
开头的方法称为魔术方法,这些方法在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()
构造函数和析构函数应该不陌生,他们在对象创建和消亡时被调用。例如我们需要打开一个文件,在对象创建时打开,对象消亡时关闭
<?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()
在对象中调用一个不可访问方法时会调用这两个方法,后者为静态方法。这两个方法我们在可变方法(Variable functions)调用中可能会用到。
<?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()
当get/set一个类的成员变量时调用这两个函数。例如我们将对象变量保存在另外一个数组中,而不是对象本身的成员变量
<?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()
对象当成字符串时的回应方法。例如使用echo $obj;
来输出一个对象
<?php // Declare a simple class class TestClass { public function __toString() { return 'this is a object'; } } $class = new TestClass(); echo $class; ?>
这个方法只能返回字符串,而且不可以在这个方法中抛出异常,否则会出现致命错误。
__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中的常量大部分都是不变的,但是有8个常量会随着他们所在代码位置的变化而变化,这8个常量被称为魔术常量。
__LINE__
,文件中的当前行号__FILE__
,文件的完整路径和文件名__DIR__
,文件所在的目录__FUNCTION__
,函数名称__CLASS__
,类的名称__TRAIT__
,Trait的名字__METHOD__
,类的方法名__NAMESPACE__
__construct()
, 클래스 생성자__destruct()
, 클래스 소멸자__call( )
, 객체에서 액세스할 수 없는 메서드를 호출할 때 호출됨
__callStatic()
, 정적 모드에서 액세스할 수 없는 메서드를 호출할 때 호출됨__get(), 클래스의 멤버 변수를 가져올 때 호출됨<p></p>
<li>
<code>__set()
, 클래스의 멤버 변수를 설정할 때 호출됨 __isset()
, isset()
또는 empty()
가 액세스할 수 없는 속성__unset()
에 대해 호출될 때 호출되고, unset()
이 액세스할 수 없는 속성에 대해 호출되었습니다. __sleep()
, serialize()
실행 시 이 함수가 먼저 호출됩니다🎜__wakeup()
, 실행 unserialize()__toString()
, 클래스가 문자열로 처리될 때의 응답 메서드🎜__invoke()
, 함수🎜__set_state()
를 호출하여 객체를 호출할 때의 응답 메서드, var_export()
를 호출하여 객체를 내보낼 때 클래스에서 이 정적 메서드가 호출됩니다. 🎜__clone()
, 객체 복사가 완료되면 호출됨 🎜🎜__construct()
및 __destruct()
🎜__call() 및 <code>__callStatic()
🎜
__get()
, __set()
, __isset()
및 __unset()
🎜__sleep()
및 __wakeup() 대신 다른 배열에 객체 변수를 저장합니다. code >🎜
serialize()
와 unserialize()
를 실행하면 이 두 함수가 먼저 호출됩니다. 예를 들어, 객체를 직렬화할 때 객체에 데이터베이스 링크가 있습니다. 역직렬화 중에 링크 상태를 복원하려면 이 두 함수를 재구성하여 링크를 복원할 수 있습니다. 예시는 다음과 같습니다. 🎜rrreee__toString()
🎜echo $obj;
를 사용하여 객체🎜rrreee🎜를 출력하려면 이 메서드는 문자열만 반환할 수 있으며 이 메서드에서는 예외가 발생할 수 없습니다. 그렇지 않으면 치명적인 오류가 발생합니다. 🎜__invoke()
🎜__set_state()
🎜var_export()
를 호출할 때 이 정적 메서드는 호출됩니다. 🎜rrreee__clone()
🎜__LINE__
, 파일의 현재 줄 번호 🎜__FILE__
, 파일의 전체 경로 및 파일 이름 🎜__FUNCTION__
, 함수 이름🎜__CLASS__
, 클래스 이름🎜 __TRAIT__ code>, Trait의 이름🎜<li>
<code>__METHOD__
, 클래스의 메소드 이름🎜__NAMESPACE__
, 이름 of the current 네임스페이스🎜🎜🎜이 마법 상수는 현재 환경 정보를 얻거나 로그를 기록하는 데 자주 사용됩니다. 🎜🎜추천 학습: "🎜PHP 비디오 튜토리얼🎜"🎜위 내용은 PHP의 매직 메소드와 매직 상수는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!