앞의 말
PHP는 객체지향 부분에 관련 매직 메소드가 많이 있습니다. 이러한 메소드는 객체지향 구현에 대한 편의성을 제공합니다. 이 기사에서는 매직 메소드를 자세히 소개합니다.
구성 메소드
클래스에는 생성자라는 특수 메서드가 하나 있습니다. 객체가 생성되면 일반적으로 몇 가지 유용한 초기화 작업을 수행하는 데 사용되는 생성자를 자동으로 호출합니다. 생성자의 선언은 이름이 두 개의 밑줄(__construct())이어야 한다는 점을 제외하면 다른 작업의 선언과 동일합니다. . 이는 PHP5의 변경 사항입니다. PHP4 버전에서는 생성자의 이름이 클래스 이름과 동일해야 합니다. 이전 버전과의 호환성을 위해 클래스에 __construct()라는 메서드가 없으면 PHP는 클래스와 동일한 이름을 가진 메서드를 검색합니다.
void __construct ([ mixed $args [, $... ]] )
생성자가 하위 클래스에 정의된 경우 해당 상위 클래스는 암시적으로 호출되지 않습니다. . 생성자. 상위 클래스의 생성자를 실행하려면 하위 클래스의 생성자에서 parent::__construct()
를 호출해야 합니다. 하위 클래스가 생성자를 정의하지 않으면 일반 클래스 메서드와 마찬가지로 상위 클래스에서 상속됩니다(private으로 정의되지 않은 경우)
<?phpclass BaseClass { function __construct() { print "In BaseClass constructor "; } }class SubClass extends BaseClass { function __construct() { parent::__construct(); print "In SubClass constructor "; } }
parent::__construct()
。如果子类没有定义构造函数则会如同一个普通的类方法一样从父类继承(假如没有被定义为 private 的话)
<?phpclass MyDestructableClass { function __construct() { print "In constructor "; $this->name = "MyDestructableClass"; } function __destruct() { print "Destroying " . $this->name . " "; } }//In constructor Destroying MyDestructableClass$obj = new MyDestructableClass();?>
析构方法
与构造方法相对的就是析构方法。析构方法是PHP5新添加的内容,在PHP4中没有析构方法。析构方法是在对象被销毁之前自动调用的方法,主要执行一些特定的操作,例如关闭文件,释放结果集等
与构造方法类似,一个类的析构方法名称必须是两个下划线 __destruct( )。析构函数不能带有任何参数
<?phpclass demo{ protected $protected = 1; public $public = 2; private $private = 3; function __get($name){ echo "111{$name}111<br>"; } }$d1 = new demo;$d1->protected;//111protected111$d1->public;$d1->private;//111private111?>
不可访问属性
get()
读取不可访问属性(protected、private)时,__get()会被调用,并将属性名以第一个参数(string)传进此方法中
public mixed __get ( string $name )
public void __set ( string $name , mixed $value )
set()
在给不可访问属性(protected、private)赋值时,__set() 会被调用,并将属性名以第一个参数(string),值作为第二参数(mixed)传进此方法中
<?phpclass demo{ protected $protected = 1; public $public = 2; private $private = 3; function __set($name,$value){ echo "0{$name}0{$value}<br>"; } }
public bool __isset ( string $name )
isset()
当对不可访问属性(protected、private)调用 isset() 或 empty() 时,__isset() 会被调用
<?phpclass demo{ protected $protected = 1; public $public = 2; private $private = 3; function __isset($name){ echo "0{$name}0<br>"; } }
<?phpclass demo{ protected $protected = 1; public $public = 2; private $private = 3; function __unset($name){ echo "0{$name}0<br>"; } }
unset()
当对不可访问属性(protected、private)调用unset()时,__unset()会被调用
public void __unset ( string $name )
<?php class Person{ private $name; private $sex; private $age; function __construct($name="",$sex="",$age=1){ $this->name= $name; $this->sex = $sex; $this->age = $age; } function __clone(){ $this->name = $this->name."的副本"; } function say(){ echo "我的名字:" .$this->name.",性别:".$this->sex.",年龄:".$this->age."<br>"; } }
对象复制
clone()
在对象克隆时会自动调用clone()方法,这方法不需要任何参数,可以通过该方法对克隆后的副本重新初始化
clone()方法会自动包含this和that两个对象的引用,this是副本对象的引用,that是原本对象的引用
<?phpclass MethodTest { public function __call($name, $arguments) { echo "Calling object method '$name' " . implode(', ', $arguments). " "; } public static function __callStatic($name, $arguments) { echo "Calling static method '$name' " . implode(', ', $arguments). " "; } }
字符串
toString()
__toString()方法用于一个类被当成字符串时应怎样回应,它是快速获取对象的字符串表示的最便捷的方式,是直接输出对象引用时自动调用的方法
public $foo; public function __construct($foo)
{
$this->foo = $foo;
} public function __toString() {
return $this->foo;
}
}$class = new TestClass('Hello');echo $class;//Hello?>
对象不存在
call()
在对象中调用一个不可访问方法时,__call()会被调用
callStatic()
在静态上下文中调用一个不可访问方法时,__callStatic()会被调用
<?phpfunction __autoload($class_name) { require_once $class_name . '.php'; }
自动加载类
autoload()
在PHP5中,可以定义一个__autoload()函数,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在PHP出错失败前有了最后一个机会加载所需的类
<?phpclass 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(); } }?>
串行化
sleep()
invoke()
get()
🎜🎜 접근할 수 없는 속성(보호, 비공개)을 읽을 때 __get()이 호출되고 속성 이름을 이 메소드를 첫 번째 매개변수로 (string)🎜🎜public mix __get ( string $name )
<?phpclass CallableClass { function __invoke($x) { var_dump($x); } }
set()
🎜🎜 값을 할당할 때 액세스할 수 없는 속성(보호됨, 비공개)인 __set()이 호출되고 속성 이름이 이 메서드에 첫 번째 매개변수(문자열)로 전달되고 값이 두 번째 매개변수(혼합)로 전달됩니다. 🎜rrreeerrreee 🎜isset ()
🎜🎜 액세스할 수 없는 속성(보호, 비공개)에 대해 isset() 또는 empty()를 호출하면 __isset()가 호출됩니다🎜rrreeerrreee🎜unset()</ code>🎜🎜 설정되지 않은 경우 ()는 액세스할 수 없는 속성(보호됨, 비공개)에 대해 호출되며, __unset()이 호출됩니다🎜🎜public void __unset ( string $name )<br/>🎜rrreee🎜 🎜🎜Object copy🎜🎜< code>clone()</ code>🎜🎜 clone() 메소드는 객체가 복제될 때 자동으로 호출됩니다. 이 메소드에는 매개변수가 필요하지 않습니다. 이 메소드를 사용하여 복제된 복사본을 다시 초기화할 수 있습니다.🎜🎜 clone() 메소드에는 두 가지 참조가 자동으로 포함됩니다. this, that, this은 복사 개체에 대한 참조이고, that은 원본 개체에 대한 참조입니다🎜rrreee🎜🎜🎜String🎜🎜<code>toString()
🎜🎜 __toString() 메서드는 다음과 같습니다. 클래스가 문자열로 처리될 때 어떻게 응답해야 할까요? 객체의 문자열 표현을 빠르게 얻을 수 있는 가장 편리한 방법입니다. 객체 참조를 직접 출력할 때 자동으로 호출되는 메소드입니다🎜🎜< ?phpclass TestClass{call()
🎜🎜 객체에서 접근할 수 없는 메소드가 호출되면 __call()이 호출됩니다🎜🎜callStatic()
🎜🎜 액세스할 수 없는 메서드가 정적 컨텍스트에서 호출됩니다. __callStatic()이 호출됩니다. 🎜rrreee🎜 🎜🎜클래스 자동 로드🎜🎜autoload()
🎜🎜 PHP5에서는 __autoload() 함수를 정의할 수 있습니다. , 호출을 사용하려고 하면 자동으로 클래스를 로드합니다. 이 함수를 호출하면 스크립트 엔진은 PHP가 오류🎜rrreee🎜🎜🎜Serialization🎜🎜sleep()
🎜으로 실패하기 전에 필요한 클래스를 로드할 마지막 기회를 갖게 됩니다.在调用serialize()函数将对象串行化时,检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。如果该方法未返回任何内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误
__sleep()函数不需要接受任何参数,但需要返回一个数组,在数组中包含需要串行化的属性。未被包含在数组中的属性将在串行化时被忽略。如果没有在类中声明__sleep()方法,对象中的所有属性都将被串行化
wakeup()
在调用unserialize()函数将对象反串行化对象时,则会自动调用对象中的__wakeup()方法,用来在二进制串重新组成一个对象时,为新对象中的成员属性重新初始化
wakeup()经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作
<?phpclass 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(); } }?>
函数调用
invoke()
当尝试以调用函数的方式调用一个对象时,__invoke()方法会被自动调用
<?phpclass CallableClass { function __invoke($x) { var_dump($x); } }
【补充】
set_state()
当调用var_export()导出类时,set_state()方法会被调用,本方法的唯一参数是一个数组,其中包含按 array('property' => value, ...) 格式排列的类属性
[注意]var_export()返回关于传递给该函数的变量的结构信息,它和var_dump()类似,不同的是其返回的表示是合法的PHP代码,也就是说,var_export返回的代码,可以直接当作php代码赋给一个变量。 而这个变量就会取得和被var_export一样的类型的值
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;
}
}
相关参考:php中文网
위 내용은 PHP 매직 메소드 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!