Home php教程 php手册 php 魔术函数使用说明

php 魔术函数使用说明

Jun 13, 2016 pm 12:18 PM
php What Instructions for use function beginning yes of trigger magic

什么是魔术函数?
对于__开头的函数就命名为魔术函数, 此类函数都在特定的条件下触发的.比如: __set() __get()等
在设置或取不存在的属性时候触发.
有那些魔术函数呢?
总的来说, 有下面几个魔术函数
__construct() __destruct() __get() __set() __isset() __unset() __call() __callStatic()
__sleep() __wakeup() __toString() __set_state() __clone() __autoload()
__construct()当实例化一个对象的时候,这个对象的这个方法首先被调用。
__destruct()当删除一个对象或对象操作终止的时候,调用该方法。

复制代码 代码如下:


class test1 {
public function __construct() {
var_dump(__function__);
}
public function __destruct() {
var_dump(__function__);
}
}
$t1 = new test1 ;
unset($t1);


__get当试图读取一个并不存在的属性的时候被调用。
__set当试图向一个并不存在的属性写入值的时候被调用。
__isset当试图检测一个并不存在的属性时候被调用。
__unset当试图取消一个并不存在的属性时候被调用。

复制代码 代码如下:


class test2 {
public $name3;
public function __set($key, $value) {
var_dump(__function__. '
KEY:'
.$key.'
Value:'
.$value);
}
public function __get($key) {
var_dump(__function__. 'KEY:'.$key);
}
public function __isset($key) {
var_dump(__function__. ' KEY:'.$key);
}
public function __unset($key) {
var_dump(__function__. ' KEY:'.$key);
}
}
$t =new test2 ;
$t->name = "steven";
$t->name2;
$t->name3;
isset($t->name2);
isset($t->name3);
unset($t->name4);


__sleep当进行序列化对象时候调用
__wakeup当进行反序列对象时候调用
需要注意一点:
1. __sleep()必须返回一个数组或者对象(一般返回的是$this),返回的值将会被用来做为序列化的
值。
如果不返回这个值,则序列化失败。这也意味着反序列化将不会触发__wakeup事件。
2. 序列化会保存默认赋值的属性.如果要通过实例化赋值的内容,则需要属性在__sleep()返回数组的
指定.
如$id与$id2的区别.

复制代码 代码如下:


class test3 {
public $name = "steven";
public $id = "1"; public $id2;
public function __sleep() {
var_dump(__function__); // 序列化不成功.没有返回值.反序列也失败 //
return array("name"); // 序列化成功.有返回值.反序列成功.id2属性能被恢复 //
return array("name", "id2");// 序列化成功.有返回值.反序列成功.id2属性不能被恢复
return array("name"); }
public function testEcho() {
var_dump($this->name);
var_dump($this->id);
var_dump($this->id2);
}
public function __wakeup() {
var_dump(__function__);
$this->testEcho();
}
}
$t3= new test3 ;
$t3->id2 = uniqid();
$t3s = serialize($t3);
unserialize($t3s);


__toString当直接打印一个对象的时候,这个方法将会被调用

复制代码 代码如下:


class test4 {
public function __toString() {
return "toString";
}
}
$t4 = new test4();
echo $t4;
print $t4;
var_dump($t4);
print_r($t4);


__call($func, $param) 当尝试调用一个不存在的方法的时候被调用.
这个方法必须有两个参数,第一个为调用的方法名,第二个是一个被调用方法的参数数组。
需要注意的是,当你在一个子类调用父类的private的方法,或者在实例里调用类的非protect方法的
时候,并不会调用__call()

复制代码 代码如下:


class test5 {
public function __call($func, $param) {
var_dump('Function:'.$func);
var_dump($param);
}
}
$t5 = new test5;
$t5->echoTest('xx','xx','xx');


__callStatic()当尝试调用一个不存在的静态方法的时候被调用
这个方法必须有两个参数,第一个为调用的方法名,第二个是一个被调用方法的参数数组。
在PHP5.3中出现

复制代码 代码如下:


class test51 {
public function __callStatic($fun, $param) {
var_dump('Function:'.$func);
var_dump($param);
}
}
test51::test('xx','xx','xx');


__set_state()当用var_export导出实例的时候被调用.此方法有一个参数,为包含所导出的实例的所
有成员属性的一个数组

复制代码 代码如下:


class test6 {
public function __set_state($arr){
var_dump($arr);
}
}
$t6 = new test6;
$t6->age = "12";
var_export($t6, true);
var_export($t6);
eval('
$b='
.var_export($t6,true).';');
print_r($b);


__clone()当克隆实例时候被调用.
注意:
1.在php5里,对象间的赋值总是以地址引用来传递的.
2.如果要以实际值来传递,则需要用到clone关键词
3.clone的只是实例。如果实例中的某个成员属性也是个实例,那么这个成员属性还是会以引用方法被
传递到新的实例。
// 对象间的赋值总是以地址引用来传递的. $t71 $t72的age属性是一样的.

复制代码 代码如下:


class test71 {
public $age = 10;
}
$t71 = new test71();
$t72 = $t71 ;
var_dump($t71->age) ;
$t71->age =12 ;
var_dump($t71->age) ;
var_dump($t72->age) ; // 如果要以实际值来传递,则需要用到clone关键词 $t73 = clone $t71; $t71->age = 13 ; var_dump($t71->age) ;
var_dump($t73->age) ; // 如果实例中的某个成员属性也是个实例,那么这个成员属性还是会以引用方法被传递到新的实例。


复制代码 代码如下:


class test74 {
public $age = 10;
public $sub = null;
}
class test75 {
public $age = 11;
}
$i = new test74;
$i->sub = new test75();
$i1 =clone $i;
var_dump($i1->sub->age);
$i->sub->age = 12;
var_dump($i1->sub->age);


// $i 和$i1虽然不是指向同一个实例,但是它们的成员属性$sub却是指向同一个实例。这时候,我们必须借
助__clone这个方法来对$sub进行复制。 // $i2和$3指向不同实例.成员属性$sub也指向不同实例.

复制代码 代码如下:


class test76 {
public $age = 10;
public $sub = null;
public function __clone() {
$this->sub = clone $this->sub;
}
}
$i2 = new test76();
$i2->sub = new test75();
$i3 = clone $i2;
$i2->sub->age = 15 ;
var_dump($i3->sub->age);


__autoload()函数.当创建一个实例化的时候,如果对应的类不存在,则会被调用

复制代码 代码如下:


function __autoload($class) {
   if ( $class == "test8" ){
require_once dirname(__FILE__).'/class8.php'; 
}
}
spl_autoload();
$t8 = new test8;
var_dump($t8->age);

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Repo: How To Revive Teammates
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

CakePHP Project Configuration CakePHP Project Configuration Sep 10, 2024 pm 05:25 PM

In this chapter, we will understand the Environment Variables, General Configuration, Database Configuration and Email Configuration in CakePHP.

PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 brings several new features, security improvements, and performance improvements with healthy amounts of feature deprecations and removals. This guide explains how to install PHP 8.4 or upgrade to PHP 8.4 on Ubuntu, Debian, or their derivati

CakePHP Date and Time CakePHP Date and Time Sep 10, 2024 pm 05:27 PM

To work with date and time in cakephp4, we are going to make use of the available FrozenTime class.

CakePHP File upload CakePHP File upload Sep 10, 2024 pm 05:27 PM

To work on file upload we are going to use the form helper. Here, is an example for file upload.

CakePHP Routing CakePHP Routing Sep 10, 2024 pm 05:25 PM

In this chapter, we are going to learn the following topics related to routing ?

Discuss CakePHP Discuss CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP is an open-source framework for PHP. It is intended to make developing, deploying and maintaining applications much easier. CakePHP is based on a MVC-like architecture that is both powerful and easy to grasp. Models, Views, and Controllers gu

How To Set Up Visual Studio Code (VS Code) for PHP Development How To Set Up Visual Studio Code (VS Code) for PHP Development Dec 20, 2024 am 11:31 AM

Visual Studio Code, also known as VS Code, is a free source code editor — or integrated development environment (IDE) — available for all major operating systems. With a large collection of extensions for many programming languages, VS Code can be c

CakePHP Creating Validators CakePHP Creating Validators Sep 10, 2024 pm 05:26 PM

Validator can be created by adding the following two lines in the controller.

See all articles