当前位置: 首页 > news >正文

invoke方法_PHP魔术方法

做下记录,温故而知新。

构造函数和析构函数

__construct 构造函数
类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。

__deconstruct
析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。

<?php
class MyDestructableClass {
    public $name;
   function __construct() {
       print "In constructorn";
       $this->name = "MyDestructableClass";
   }

   function __destruct() {
       print "Destroying " . $this->name . "n";
   }
}

$obj = new MyDestructableClass();
?>

方法重载

public __call ( string $name , array $arguments ) : mixed
public static __callStatic ( string $name , array $arguments ) : mixed

在对象中调用一个不可访问方法时,__call() 会被调用。

在静态上下文中调用一个不可访问方法时,__callStatic() 会被调用。

方法不存在时也会经过此函数,可以做特殊处理,比如实现一个redis操作类,绝大多数的操作方法可以直接从predis本身的,这时借助__call很容易实现这样的功能

属性重载

public __set ( string $name , mixed $value ) : void
public __get ( string $name ) : mixed
public __isset ( string $name ) : bool
public __unset ( string $name ) : void

在给不可访问属性赋值时,__set() 会被调用。

读取不可访问属性的值时,__get() 会被调用。

当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。

当对不可访问属性调用 unset() 时,__unset() 会被调用。

参数 name 是指要操作的变量名称。__set() 方法的name 是指要操作的变量名称。__set() 方法的value 参数指定了 $name 变量的值。

属性重载只能在对象中进行。在静态方法中,这些魔术方法将不会被调用。所以这些方法都不能被 声明为 static

属性重载 当属性不存在的时候也会进入魔术方法,可以在方法中做处理,比如依赖注入的setter使用
<?php
class PropertyTest {
     /**  被重载的数据保存在此  */
    private $data = array();

 
     /**  重载不能被用在已经定义的属性  */
    public $declared = 1;

     /**  只有从类外部访问这个属性时,重载才会发生 */
    private $hidden = 2;

    public function __set($name, $value) 
    {
        echo "Setting '$name' to '$value'n";
        $this->data[$name] = $value;
    }

    public function __get($name) 
    {
        echo "Getting '$name'n";
        if (array_key_exists($name, $this->data)) {
            return $this->data[$name];
        }

        $trace = debug_backtrace();
        trigger_error(
            'Undefined property via __get(): ' . $name .
            ' in ' . $trace[0]['file'] .
            ' on line ' . $trace[0]['line'],
            E_USER_NOTICE);
        return null;
    }

    /**  PHP 5.1.0之后版本 */
    public function __isset($name) 
    {
        echo "Is '$name' set?n";
        return isset($this->data[$name]);
    }

    /**  PHP 5.1.0之后版本 */
    public function __unset($name) 
    {
        echo "Unsetting '$name'n";
        unset($this->data[$name]);
    }

    /**  非魔术方法  */
    public function getHidden() 
    {
        return $this->hidden;
    }
}


echo "<pre>n";

$obj = new PropertyTest;

$obj->a = 1;
echo $obj->a . "nn";

var_dump(isset($obj->a));
unset($obj->a);
var_dump(isset($obj->a));
echo "n";

echo $obj->declared . "nn";

echo "Let's experiment with the private property named 'hidden':n";
echo "Privates are visible inside the class, so __get() not used...n";
echo $obj->getHidden() . "n";
echo "Privates not visible outside of class, so __get() is used...n";
echo $obj->hidden . "n";
?>

__toString()public __toString ( void ) : string__toString() 方法用于一个类被当成字符串时应怎样回应。例如 echo $obj; 应该显示些什么。此方法必须返回一个字符串,否则将发出一条 E_RECOVERABLE_ERROR 级别的致命错误。

<?php
// Declare a simple class
class TestClass
{
    public $foo;

    public function __construct($foo) 
    {
        $this->foo = $foo;
    }

    public function __toString() {
        return $this->foo;
    }
}

$class = new TestClass('Hello');
echo $class;
?>

__invoke()__invoke ([ $... ] ) : mixed当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。

<?php
  class CallableClass 
  {
      function __invoke($x) {
          var_dump($x);
      }
  }
  $obj = new CallableClass;
  $obj(5);
  var_dump(is_callable($obj));
  ?>

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要

PHP进阶架构师>>>视频、面试文档免费获取​docs.qq.com
829afd70fcfb2ecd05eda1fa2e9afacb.png

或 者关注咱们下面的知乎专栏

PHP架构师圈子​zhuanlan.zhihu.com
6352db939a7ff26af18d03b198ddb3c4.png
来源:https://www.cnblogs.com/followyou/p/11827981.html

相关文章:

  • PV、UV、IP的区别
  • mysqld:表mysql.plugin不存在_详解MySQL Binlog解析工具--binlog2sql,基于表级别的数据恢复...
  • css的经典三栏式布局
  • mysql text字段导出_看完能涨工资的MySQL性能优化指南
  • python生成list_python 使用循环生成list
  • 关于vue中的nextTick深入理解
  • hashmap 遍历_你一般是怎么遍历HashMap的?
  • 团队名称:极限定理
  • 人工智能的三层基本架构_“人工智能”如何“深度学习”?
  • SQLite3使用详解
  • class反编译成java_Java源代码保护方法,通过加密技术保护源代码
  • 英伟达硬件加速编解码
  • python字典属于无序序列_五:Python序列之字典
  • Excel作为数据源TesTNG做数据驱动完整代码
  • ps工具预设_「设计干货」不要浪费时间调整设计效果图了,20款灯光预设送你用...
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • express.js的介绍及使用
  • Git的一些常用操作
  • Gradle 5.0 正式版发布
  • MySQL数据库运维之数据恢复
  • node 版本过低
  • Redis中的lru算法实现
  • Windows Containers 大冒险: 容器网络
  • 诡异!React stopPropagation失灵
  • 配置 PM2 实现代码自动发布
  • 如何使用 JavaScript 解析 URL
  • 推荐一个React的管理后台框架
  • 应用生命周期终极 DevOps 工具包
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • raise 与 raise ... from 的区别
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • 数据库巡检项
  • #QT(一种朴素的计算器实现方法)
  • #控制台大学课堂点名问题_课堂随机点名
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (2)STL算法之元素计数
  • (C语言)字符分类函数
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (笔试题)分解质因式
  • (算法)N皇后问题
  • (万字长文)Spring的核心知识尽揽其中
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • ***详解账号泄露:全球约1亿用户已泄露
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET大文件上传知识整理
  • @angular/cli项目构建--Dynamic.Form
  • [ 云计算 | AWS ] 对比分析:Amazon SNS 与 SQS 消息服务的异同与选择
  • [100天算法】-不同路径 III(day 73)
  • [ACTF2020 新生赛]Include
  • [bzoj2957]楼房重建
  • [C#]使用DlibDotNet人脸检测人脸68特征点识别人脸5特征点识别人脸对齐人脸比对FaceMesh