码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • PHP8中的魔术方法-PHP8知识详解


    在PHP 8中,魔术方法是一种特殊的方法,它们以两个下划线(__)开头。魔术方法允许您定义类的行为,例如创建对象、调用其他方法或访问和修改类的属性。以下是一些常见的魔术方法:

    __construct(): 类的构造函数。当一个对象被创建时自动调用。

    __destruct(): 类的析构函数。当一个对象被销毁时自动调用。

    __get($name): 在读取一个不可访问属性的值时自动调用。

    __set($name, $value): 在给一个不可访问属性赋值时自动调用。

    __isset($name): 在对不可访问属性调用 isset() 或 empty() 函数时自动调用。

    __unset($name): 在对不可访问属性调用 unset() 函数时自动调用。

    __call($name, $arguments): 在调用一个不存在或不可访问的方法时自动调用。

    __callstatic($name, $arguments): 在调用一个不存在或不可访问的静态方法时自动调用。

    __toString(): 在将对象作为字符串输出时自动调用。

    __invoke($arguments): 当尝试将对象作为函数调用时自动调用。

    __clone(): 当对象被克隆时自动调用。

    __debugInfo(): 在使用 var_dump() 函数输出对象信息时自动调用。

    __serialize(): 在对象被序列化时自动调用。

    __unserialize($data): 在对象被反序列化时自动调用。

    __sleep(): 在对象被序列化时自动调用,返回要序列化的属性列表。

    __wakeup(): 在对象被反序列化时自动调用。

    Image

    因为php8有众多的魔术方法,本文也不会一一详细说明了,本文以__set()和__get()方法来详细讲解。

    由于面向对象思想并不鼓励直接从类的外部访问类的属性,以强调封装性,所以可以使用__get 和__set 方法来达到此目的。无论何时,类属性被访问和操作时,访问方法都会被激发。通过使用它们,可以避免直接对类属性进行访问。

    (1)当程序试图写入一个没有定义或不可见的成员变量时,PHP就会执行__set()方法。该方法包含两个参数,分别表示变量名称和变量值。

    (2) 当程序调用一个没有定义或不可见的成员变量时,PHP就会执行__get()方法来读取变量值。该方法包含一个参数,表示要调用变量的名称。

    使用__set()和__get()方法,参考代码:

    1.     class Fruit{
    2.         function __set($names,$value){
    3.             $this->$names = $value;
    4.         }
    5.         function __get($names){
    6.             return $this->$names;
    7.         }
    8.     };
    9.     $a = new Fruit ();
    10.     $a->name = "梨子";
    11.     $a->price = "3.88元";
    12.     echo $a->name."的价格为:".$a->price."
      "
      ;
    13.     $b = new Fruit();
    14.     $b->name = "火龙果";
    15.     $b->num="666公斤";
    16.     $b->price= "4.88元";
    17.     echo $b->name."的库存为:".$b->num.",价格为: ".$b->price."
      "
      ;
    18. ?>

    以上代码在PHP8中的运行结果如下:

    1. 梨子的价格为:3.88元
    2. 火龙果的库存为:666公斤,价格为: 4.88元

    上面代码中,变量name、price、num都是没有定义成员变量,所以此时会调用__set()和__get()方法。

  • 相关阅读:
    Dell R720服务器已有win10系统下安装Ubuntu10.04双系统
    Java基础面试,什么是面向对象,谈谈你对面向对象的理解
    Multi-View Learning(多视图学习/多视角学习 )是什么? Co-training(协同训练)和它的关系
    微软发布2023年10月补丁,修复了103个缺陷,包括2个活跃的漏洞利用
    基于Java纯净水商城配送系统设计与实现 开题报告
    链的解构主义:一览 9 大模块化公链
    C语言 结构体
    浅谈go语言的错误处理
    react redux 状态管理
    Android Compose 权限请求
  • 原文地址:https://blog.csdn.net/u010292470/article/details/133621120
  • 最新文章
  • C# ESP32/STM32 轻量 Web 能力库:PicoServer.Nano
    告别手动计算,SymPy 初识与 Manim 联动
    Git实战覆盖98%日常开发场景
    CC5 反序列化链分析
    踩坑实录:读写分离导致批量删除逻辑问题
    C#如何优雅处理引用类型的深拷贝
    三天用 Claude + Kimi 完成一个微信小程序,完整流程全记录
    可观测性不是孤岛:团队协作与文化变革
    AScript之匿名类型与动态类型
    16. LangChain ChatPromptTemplate多模态应用实战
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号