PHP面向对象中魔术方法使用
来源:互联网 发布:google浏览器for mac 编辑:程序博客网 时间:2024/06/06 18:29
一:
PHP为我们提供了一系列用__开头的函数,这些函数无需自己动手调用,会在何时的时机自动调用,称这类函数为魔术函数。
如:
function __construct( ) {} 在new一个新对象时自动调用此函数。
二:
1:构造函数__construct()和析构函数_destruct()
在new新的Player对象时会调用__construct()函数。对象销毁前自动调用__destruct函数。
代码如下:
<?php class Player{ public $name; public $age; function __construct( $name, $age ){ echo "构造函数<br>"; $this->name = $name; $this->age = $age; } function getName( ){ return $this->name; } function __destruct( ){ echo "析构函数<br>"; } } $player_1 = new Player( "kobe", 36 ); $name = $player_1->getName( ); echo $name; echo "<br>"; unset($player_1); echo "end";?>
运行结果:
2:__get():访问类中私有属性时自动调用,传递读取属性名,返回$this->属性名。
当直接访问私有成员变量echo $player_1->name;时,会有报错信息,显示不能调用name。
使用__get可以访问私有属性。
<?php class Player{ private $name; function __construct( $name ){ echo "构造函数<br>"; $this->name = $name; } function __get( $name ){ return $this->$name; } } $player_1 = new Player( "kobe", 36 ); echo $player_1->name; echo "<br>";?>
运行结果如下:
3:__set():给类的私有属性赋值时调用,传递需设置的属性名。属性值。
当设置私有成员变量$player_1->name = “james”;时,会有报错信息。
正确打开方式是:
<?php class Player{ private $name; private $age; function __construct( $name ){ echo "构造函数<br>"; $this->name = $name; } function __set( $key, $value ){ $this->$key = $value; } function __get( $name ){ return $this->$name; } } $player_1 = new Player( "kobe", 36 ); $player_1->name = "james"; echo $player_1->name; echo "<br>";?>
运行结果如下:
4:__isset():和 __unset():
__isset():检测对象私有属性时调用,传递检测的属性名,返回isset($this->属性名)。
__unset():使用unset函数删除对象的私有属性时调用,传递删除的属性名。方法中执行unset($this->属性名)。
unset私有成员变量时,会有报错信息。
代码如下:
<?php class Player{ private $name; private $age; function __construct( $name ){ echo "构造函数<br>"; $this->name = $name; } function __isset( $key ){ return isset( $this->$key); } function __unset( $key ){ unset( $this->$key ); } } $player_1 = new Player( "kobe", 36 ); if ( isset($player_1->name) ) echo "name 成员变量存在"; else echo "name 成员变量不存在"; unset($player_1->name); echo "<br>";?>
5:__toString():使用echo打印对象时调用,返回打印对象时想要显示的内容,返回必须是字符串。
echo $player_1;时会有报错信息。
代码如下:
<?php class Player{ private $name; function __construct( $name ){ echo "构造函数<br>"; $this->name = $name; } function __toString(){ return "显示对象"; } } $player_1 = new Player( "kobe" ); echo $player_1; echo "<br>";?>
运行结果:
6:__call():调用一个类中未定义的方法或者私有、受保护的方法时自动调用__call函数。传递被调用的函数名及参数列表。
<?php class Player{ public $name; function __construct( $name ){ echo "构造函数<br>"; $this->name = $name; } private function getName(){ return $this->$name; } function __call( $funcName, $funcParams ){ echo "调用的函数是$funcName, 参数列表是:"; print_r( $funcParams ); } } $player_1 = new Player( "kobe" ); echo $player_1->setName( "james" ); echo "<br>"; echo $player_1->getName(); echo "<br>";?>
7:__clone():当使用clone关键字克隆一个对象时自动调用,作用是为新克隆的对象初始化赋值。
<?php class Player{ public $name; function __construct( $name ){ echo "构造函数<br>"; $this->name = $name; } function __clone( ){ $this->name = "james"; } } $player_1 = new Player( "kobe" ); echo $player_1->name . "<br>"; $player_2 = clone $player_1; echo $player_2->name . "<br>"; echo "<br>";?>
运行结果如下:
8:__sleep():对象序列化时自动调用,返回一个数组,数组中的值就是可以序列化的属性。可以定义serialize()序列化时返回的数据。
不使用__sleep时,serialize()返回类中所有的成员变量数据。
使用__sleep之后的代码如下:
<?php class Player{ public $name; public $age; public $sex; function __construct( $name, $age, $sex ){ echo "构造函数<br>"; $this->name = $name; $this->age = $age; $this->sex = $sex; } function __sleep( ){ return array("name", "sex"); } } $player_1 = new Player( "kobe", 35, "male" ); echo serialize($player_1);?>
运行结果如下:
9:__wakeup():对象反序列化时调用,为反序列化新产生的对象进行初始化赋值。
代码如下:
<?php class Player{ public $name; public $age; public $sex; function __construct( $name, $age, $sex ){ echo "构造函数<br>"; $this->name = $name; $this->age = $age; $this->sex = $sex; } function __wakeup( ){ $this->name = "kobe"; $this->age = 35; $this->sex = true; } } $player_1 = new Player( "kobe", 22, false ); $temp = serialize($player_1); $player_2 = unserialize($temp); var_dump($player_2);?>
运行结果:
- PHP面向对象中魔术方法使用
- php面向对象魔术方法
- PHP面向对象-----魔术方法
- PHP面向对象中常用关键字和魔术方法
- php面向对象之-魔术方法__set__get__unset__isset的使用-126
- PHP中面向对象编程之封装以及魔术方法的使用
- PHP面向对象中的魔术方法
- PHP面向对象魔术方法复习
- Php面向对象魔术方法总结
- PHP中的面向对象魔术方法大全
- PHP之面向对象的魔术方法
- php面向对象笔记5 魔术方法
- PHP面向对象:封装--魔术方法__set()
- PHP面向对象:封装--魔术方法__get()
- PHP面向对象:魔术方法__toString()
- PHP面向对象:魔术方法__call()
- 面向对象--魔术方法
- PHP面向对象 1.7 常见的魔术方法及应用
- 前后端分离的意义以及对前端工程化的理解
- POJ1364:King(差分约束)
- Vue跨域问题
- Stack-----225. Implement Stack using Queues
- centos minimal配置
- PHP面向对象中魔术方法使用
- 数据库SQL实战练习(上)
- Stack----232. Implement Queue using Stacks
- 集合与io流
- php 好用的日志类
- 多线程与网络
- php 好用的验证码类
- spyder的相关设置及debug
- Qter 遇见的大牛!