zoukankan      html  css  js  c++  java
  • 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章 类的自动加载

     

     

     类的自动加载 高级加载

  • 相关阅读:
    Ⅰ.Spring的点点滴滴--序章
    Ⅶ.AngularJS的点点滴滴-- 事件
    Ⅵ.AngularJS的点点滴滴-- 指令
    vue路由跳转
    使用<a-select>时,placeholder不起作用
    动态配置生成echarts图表
    elementui resetFields()不起作用
    input输入框与button按钮之间存在空隙
    一个怂女婿的成长笔记【二十二】
    一个怂女婿的成长笔记【七】
  • 原文地址:https://www.cnblogs.com/qianjilou/p/6371779.html
Copyright © 2011-2022 走看看