__set() __get() 方法详解

PHP 魔术方法__set() __get() 方法

先看看官方文档的解释
__set() is run when writing data to inaccessible properties.
__get() is utilized for reading data from inaccessible properties.
究竟用中文怎么翻译呢?   inaccessible :n. 难达到;难接近;无法理解。
有代码有真相:

<?php
error_reporting (E_ALL);
class  stu{
     private  $a ;
     private  $b  = 0;
     public  $c ;
     public  $d  = 0;
     
     //这里的 private 可以用 protected public 替代
     private  function  __get( $name ) {
         return  123;
     }
     
     //这里的 private 也可以用 protected public 替代
     private  function  __set( $name , $value ) {
         echo  "This is set function" ;
     }
}
 
$s  = new  stu();
 
var_dump( $s ->a);  //output: 123
var_dump( $s ->b);  //output: 123
var_dump( $s ->c);  //output: null
var_dump( $s ->d);  //output: 0
var_dump( $s ->e);  //output: 123
 
$s ->a = 3;   //output: This is set function
$s ->c = 3;  //no output
$s ->f = 3;  //output: This is set function
?>

 结果:
如果没有__get方法,执行 var_dump($s->a)  var_dump($s->b) 会有致命的错误
如果没有__get方法,执行 var_dump($s->e) 会有一个notice,提示没有定义属性 $e
总结:
1. 从一个难以访问的属性读取数据的时候 __get() 方法被调用
2. 向一个难以访问的属性赋值的时候 __set() 方法被调用
3. 难以访问包括:(1)私有属性,(2)没有初始化的属性
4. __isset() __unset() 也类似

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`uvm_get_extension` 是 SystemVerilog 中 UVM (Universal Verification Methodology) 框架中的一个函数,用于获取一个给定对象上的扩展(extension)对象。该函数的声明如下: ```systemverilog function uvm_object uvm_get_extension(input uvm_object obj, input type_id_t ext_type_id); ``` 其中,`obj` 是要查询扩展的对象,`ext_type_id` 是要查询的扩展对象的类型 ID。 使用 `uvm_get_extension` 获取对象的扩展对象有以下几个步骤: 1. 定义一个扩展类,这个类需要继承自 `uvm_object` 类,并且实现一个纯虚函数 `function string get_type_name()`,用于返回该类的类型名称; 2. 在要被扩展的对象中定义一个扩展对象指针成员变量; 3. 在需要给对象添加扩展对象时,先创建该扩展对象,然后使用 `uvm_set_extension` 函数将其附加到对象上; 4. 在需要获取对象的扩展对象时,使用 `uvm_get_extension` 函数进行查询。 以下是一个示例代码,演示了如何使用 `uvm_get_extension` 函数: ```systemverilog class my_extension extends uvm_object; `uvm_object_utils(my_extension) // 在这里定义扩展类的成员变量和方法 virtual function string get_type_name(); return "my_extension"; endfunction endclass class my_class extends uvm_object; `uvm_object_utils(my_class) my_extension my_ext; // 在这里定义类的成员变量和方法 function void add_extension(); my_ext = new("my_ext"); uvm_set_extension(this, my_ext); endfunction function void print_extension(); my_extension ext; ext = uvm_get_extension(this, my_extension::get_type()); if (ext == null) begin $display("Object has no extension"); end else begin $display("Extension found: %s", ext.get_type_name()); end endfunction endclass module tb; my_class obj; initial begin obj = new("obj"); obj.add_extension(); obj.print_extension(); end endmodule ``` 在上述代码中,我们定义了一个扩展类 `my_extension`,并将其作为成员变量添加到了 `my_class` 类中。在 `my_class` 类中,我们定义了两个函数 `add_extension` 和 `print_extension`,分别用于添加扩展对象和查询扩展对象。在 `add_extension` 函数中,我们使用 `uvm_set_extension` 函数将 `my_extension` 类型的对象附加到 `my_class` 对象上。在 `print_extension` 函数中,我们使用 `uvm_get_extension` 函数查询 `my_class` 对象上是否有 `my_extension` 类型的扩展对象,并打印出查询结果。 注意,使用 `uvm_get_extension` 函数查询扩展对象时,需要传入要查询的扩展对象类型的 type_id_t。在上面的示例代码中,我们使用 `my_extension::get_type()` 函数获取了 `my_extension` 类型的 type_id_t。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值