DAY19

魔术方法

4.1 魔术方法一览

 

 

说明

(1) 魔术方法都是系统提供,程序员使用即可.

(2) 所有的魔术方法,前面都是以  __ 开头的 _是两个下划线.

(3) 我们在自定义函数时,就不要使用 __开头了.

(4) 魔术方法是在满足某个条件(一会一个一个的说明)时,有系统自动的调用.

1.1 访问控制修饰符的基本入门介绍

介绍

因为魔术方法和访问修饰符关系密切,因此我们需要先学习一下访问控制修饰符的基本知识, 这里我们先讲一个基本的介绍.

文档的介绍:

属性方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。被定义为公有的类成员可以在任何地方被访问。被定义为受保护的类成员则可以被其自身以及其子类和父类访问。被定义为私有的类成员则只能被其定义所在的类访问

(1) 访问控制修饰符可以修饰成员属性,也可以修饰方法.

(2) 有三种 public , protected private

使用代码来说明

 

 

 

1.1 魔术方法之-__get __set函数

基本的介绍

(1) 当程序员去使用不可以访问的属性时,系统就会调用__get方法.

(2) 不可以访问的属性指的是(1 . 该属性不存在 2. 直接访问了protected或者private属性)

(3) 当程序员去给不可以访问的属性直接赋值,系统就会调用__set方法

举例说明

需求是: 如果对象有一个成员变量是privateprotectd的,我希望在在类的外部通过 : $对象名->变量名的方式来赋值和取值,怎么办?

 

课堂练习

1.1 魔术方法之-__isset __unset函数

基本介绍

(1) 当对不可访问的属性进行了 isset($对象名->属性)empty($对象名->属性)操作,那么__isset函数就会被系统调用。

(2) 不可访问的属性 仍然和前面说的一样

(3) 当对不可访问的属性进行了 unset($对象名->属性), 那么__unset函数就会被系统调用

代码说明

补充说明一下语法现象-属性重载

补充说明一下-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魔术方法.

  •  代码说明

 

小练习

做两个怪物!

 

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).

  •  案例说明

课堂小练习

 


 


 

 

第5章 类的自动加载

 

 

 类的自动加载 高级加载

原文地址:https://www.cnblogs.com/qianjilou/p/6371779.html