这里有新鲜出炉的 PHP 面向对象编程,程序狗速度看过来!
PHP(外文名: Hypertext Preprocessor,中文名:"超文本预处理器")是一种通用开源脚本语言。语法吸收了 C 语言、Java 和 Perl 的特点,入门门槛较低,易于学习,使用广泛,主要适用于 web 开发领域。PHP 的文件后缀名为 php。
本篇文章主要介绍了浅谈 PHP 中的面向对象 OOP 中的魔术方法 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
一、什么是魔术方法:
PHP 为我们提供了一系列用__开头的函数,这些函数无需自己手动调用,会在合适的时机自动调用,这类函数称为魔术函数。
例如:
在 new 一个新对象时自动调用此函数
- function __construct(){}
二、PHP 中都有那些魔术方法,以及它们的作用:
1.__construct(): 构造函数,new 对象时自动调用
eg:
- class Person {
- public $name;
- public $age;
- function __construct($name, $age) {
- $this - >name = $name;
- $this - >age = $age;
- }
- }
在 new 新的 Person 对象时会自动调用__construct() 函数,将传入的参数分别赋给 $name,$age。
2.__destruct(): 析构函数,当一个对象被销毁前自动调用
- class Person {
- public $name;
- public $age;
- function __destruct() {
- echo "这个对象被销毁了";
- }
- }
同上所述,对象被销毁时执行此魔术方法
3.__get(): 访问类中私有属性时自动调用,传递读取属性名,返回 $this-> 属性名
- class Person {
- private $name;
- public $age;
- function __get($name) {
- return $this - >$name;
- }
- }
如上代码,$name 被设为私有属性后不能直接通过 $this->name; 的方式读取,因此需要设置__get() 魔术方法来读取。
4.__set(): 给类的私有属性赋值时自动调用,传递需设置的属性名,属性值
- class Person {
- private $name;
- public $age;
- function __set($key, $value) {
- $this - >$key = $value;
- }
- }
同__get() 方法,私有属性不能通过 $this->name="aaa"; 的方式直接设置,需要设置__set() 方法,传入的参数分别是属性名和属性值。
5.__isset(): 使用 isset 检测对象私有属性时调用,传递检测的属性名,返回 isset($this-> 属性名)
- class Person {
- private $name;
- public $age;
- function __isset($name) {
- return isset($this - >$name);
- }
- }
使用 isset 检测对象私有属性时调用,其他同上。
6.__unset(): 使用 unset() 函数删除对象私有属性时调用,传递删除的属性名,方法中执行 unset($this-> 属性名)
- class Person {
- private $name;
- public $age;
- function __unset($name) {
- unset($this - >$name);
- }
- }
同上,在用 unset() 函数删除私有属性时调用。
7.__toString(): 使用 echo 打印对象时调用,返回打印对象时想要显示的内容,返回必须是字符串
- class Person{
- public $name;
- public $age;
- function __toString(){
- $str = <<<str
- 您要打印的内容是:<br>
- \$name=>{$this->name};<br>
- \$age=>{$this->age};<br>
- str;
- return $str;
- }
- }
使用 echo 打印对象时调用,返回打印对象时想要显示的内容。
8.__call(): 调用一个类中未定义的或未公开的方法时自动调用,传递被调用的函数名及参数列表
- class Person {
- public $name;
- public $age;
- function __call($funcName, $funcParams) {
- echo "您调用的函数{$funcName},参数列表";
- print_r($funcParams);
- echo "不存在/未公开";
- }
- }
- $zhangsan = new Person();
- $zhangsan - >say(1, 2, 3);
如代码所示,调用不存在的 say(1,2,3); 时,会打印
您调用的函数 way,参数列表 Array ([0] => 123 ) 不存在
9.__clone(): 当使用 clone 关键字,克隆一个对象时自动调用,作用是为新克隆的对象初始化赋值
- class Person {
- public $name;
- public $age;
- function __clone() {
- $this - >name = "lisi";
- }
- }
- $zhangsan = new Person("zhangsan", 24);
- $lisi = clone $zhangsan;
- echo $lisi - >name;
打印出的结果是 "lisi", 而不是 "zhangsan"。
10.__sleep(): 对象序列化时自动调用,返回一个数组,数组中的值就是可以序列化的属性
- class Person {
- public $name;
- public $age;
- function __sleep() {
- return array("name", "age");
- }
- }
如上述代码,在用 serialize() 序列化对象时只有"name","age" 属性会被序列化。
11.__wakeup(): 对象反序列化时自动调用,为反序列化新产生的对象进行初始化赋值
- class Person {
- public $name;
- public $age;
- function __wakeup() {
- $this - >name = "lisi";
- }
- }
将对象序列化后再反序列化,同时给对象的 name 属性赋初值为 "lisi"。
12.__autolode(): 需要在类外部声明函数,当实例化一个未声明的类时自动调用,传递实例化的类名,可以使用类名自动加载对应的类文件。
- function __autoload($className) {
- include "class/".strtolower($className).".class.php";
- }
- $zhangsan = new Person();
- $zhangsan - >say();
如上述代码,Person 类不存在时调用__autolode() 方法,载入写在文件外的类,"class/".strtolower($className).".class.php";就是类文件的相对路径,$className 就是
不在本文件中的类的类名,因此在创建外部类文件时命名方式必须是小写的类名. class.php。__autolode() 方法也是惟一一个不用写在类中的魔术方法。
以上就是 PHP 中的魔术方法,合理利用这些方法可以轻松实现对象的各种操作。希望对大家的学习有所帮助,也希望大家多多支持 PHPERZ。
来源: http://www.phperz.com/article/17/0809/339529.html