魔术方法
4.1 魔术方法一览
说明
(1) 魔术方法都是系统提供,程序员使用即可.
(2) 所有的魔术方法,前面都是以 __ 开头的 _是两个下划线.
(3) 我们在自定义函数时,就不要使用 __开头了.
(4) 魔术方法是在满足某个条件(一会一个一个的说明)时,有系统自动的调用.
1.1 访问控制修饰符的基本入门介绍
l 介绍
因为魔术方法和访问修饰符关系密切,因此我们需要先学习一下访问控制修饰符的基本知识, 这里我们先讲一个基本的介绍.
l 文档的介绍:
对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。被定义为公有的类成员可以在任何地方被访问。被定义为受保护的类成员则可以被其自身以及其子类和父类访问。被定义为私有的类成员则只能被其定义所在的类访问
(1) 访问控制修饰符可以修饰成员属性,也可以修饰方法.
(2) 有三种 public , protected 和 private
l 使用代码来说明
1.1 魔术方法之-__get 和 __set函数
l 基本的介绍
(1) 当程序员去使用不可以访问的属性时,系统就会调用__get方法.
(2) 不可以访问的属性指的是(1 . 该属性不存在 2. 直接访问了protected或者private属性)
(3) 当程序员去给不可以访问的属性直接赋值,系统就会调用__set方法
l 举例说明
需求是: 如果对象有一个成员变量是private、protectd的,我希望在在类的外部通过 : $对象名->变量名的方式来赋值和取值,怎么办?
l 课堂练习
1.1 魔术方法之-__isset 和 __unset函数
l 基本介绍
(1) 当对不可访问的属性进行了 isset($对象名->属性), empty($对象名->属性)操作,那么__isset函数就会被系统调用。
(2) 不可访问的属性 仍然和前面说的一样 。
(3) 当对不可访问的属性进行了 unset($对象名->属性), 那么__unset函数就会被系统调用
l 代码说明
l 补充说明一下语法现象-属性重载
补充说明一下-property_exists()函数
<?php
header('content-type:text/html;charset=utf-8');
//property_exists说明
class A{
public $name;
protected $food;
public function __construct($name, $food){
$this->name = $name;
$this->food = $food;
}
}
$a = new A('小猫', '鱼儿');
unset($a->name);
echo'<pre>';
var_dump($a);
if(property_exists($a, 'name')){
echo '<br> name属性存在';
}
//属性的重载
$a->age = 100;
echo '<pre>';
var_dump($a);
if(property_exists($a, 'age')){
echo '<br> age属性存在';
}else{
echo '<br> age属性不存在';
}
unset($a->age);
echo '<pre>';
echo '<br>---------<br>';
var_dump($a);
if(property_exists($a, 'age')){
echo '<br> age属性存在';
}else{
echo '<br> age属性不存在';
}
//property_exists(对象名, 属性)
//1. 先判断该对象是否有这个属性,如果有则返回真.
//2. 如果该对象没有有这个属性, 则继续判断该对象对应的类是否定义过这个属性,如果定义过仍然返回真,否则才返回假
4.5 魔术方法之-__toString 函数
- 基本介绍:
当我们希望将一个对象当做字符串来输出时,就会触发__toString魔术方法.
- 代码说明
l 小练习
做两个怪物!
4.6 魔术方法之-__clone函数
- 基本介绍 :
当我们需要将一个对象完全的赋值一份, 保证两个对象的属性和属性值一样,但是他们的数据库空间独立,则可以使用对象克隆。
- 案例说明
说明
(1) 当我们 $对象1 = clone $对象2, 会触发 __clone 方法
(2) 如果我们希望在克隆时,修改某个属性,则在__clone方法中去修改即可
(3) 如果我们希望阻止克隆,只需要将 __clone 魔术方法申明为private 即可.
4.7 魔术方法之-__call函数
- 基本介绍:
(1) 当我们调了一个不可以访问的成员方法时,__call魔术方法就会被调用.
(2) 不可以访问的成员方法的是指(1. 该成员方法不存在, 2. 成员方法是protected或者 private)
- 需求
我们就是希望,在类的外部直接调用不可访问的成员方法(private , protected).
- 案例说明
l 课堂小练习
第5章 类的自动加载
类的自动加载 高级加载