13个魔术方法

构造方法(构造函数)

触发条件:由类生成一个对象时触发

方法名: __construct

作用:对象的初始化

 

 

析构方法:

触发条件:当对象释放的时候则触发

方法名:__destruct

作用:释放或关闭资源

 

什么时候会销毁对象?

1、当php脚本执行结束(php文件加载完毕),会释放所有的资源

2、通过unset()手动释放对象

unset() 不一定导致对象的释放,当所有引用对象的变量都被unset掉之后,对象才会被释放

只要有一个没有被释放,则对象都不会释放

 

clone 对象

1、克隆可以产生新对象,不会触发构造方法

2、魔术方法 __clone

触发条件:当克隆对象的时候触发

 

对象克隆与对象赋值的区别?

克隆:产生新的对象,一个对象发生改变其他的不会改变。彼此之间相互独立

赋值:不会产生新的对象,只是增加对对象的引用,一个发生变化其他的都会随之改变

 

unset(变量名):释放变量

__unset($name):

触发场景:当释放一个不可见的成员属性的时候触发该魔术方法

参数:

$name:获取你要释放不可见的成员属性名

 

__toString()

触发条件:当你echo一个对象的时候会触发该魔术方法

返回值:返回值必须是一个字符串,用于代替对象输出展示

 

__sleep:

触发条件:当序列化一个对象的时候触发

返回值:类型为一个数组,里面包含要序列化的成员属性名

 

 

__wakeup:

触发条件:当反序列化生成一个对象的时候触发

 

serialize 序列化

unserialize 反序列化

 

__set($name,$value)

触发场景:当设置一个类中不可见的成员属性触发该魔术方法

参数:

$name:接收不可见的成员属性名

$value:要设置的值

empty:判断一个变量是否为空

 

isset:判断一个变量是否存在

__isset($name):

触发条件:使用empty或isset判断一个不可见的成员属性是否为空或是否存在的时候触发

参数:

$name:接收要检测的不可见的成员属性名

魔术方法:

1、方法名

2、触发条件

3、参数:参数代表的含义

4、返回值:含义和数据类型

不可见说明:

1、无权访问

2、不存在

 

__get:当访问类中不可见的成员属性的时候触发

参数:

必须有一个参数,用来接收不可见成员属性的名称

 

__callStatic($name,$args)

触发场景:当你访问不可见的静态成员方法时触发该魔术方法

参数:

$name:接收访问不可见的成员方法名

$args:接收调用方法时传入的参数,数据类型是数组

 

注意:

1、该魔术方法需为静态方法

2、静态成员方法中只能含有静态成员属性,不可以含有非静态成员属性

3、类常量是否可以存在于静态方法中?可以

 

 

__call($name,$args)

触发场景:当你访问不可见的成员方法时触发该魔术方法

参数:

$name:接收访问不可见的成员方法名

$args:接收调用方法时传入的参数,数据类型是数组

 

__autoload($className)

触发条件:在使用不存在的类的时候会自动触发该函数

作用:实现类的自动加载

参数: $className 接受类名

__autoload() 已经被弃用 建议使用 spl_aotoload_register()

举例说明

1 魔术方法 __get() 当试图读取一个并不存在的属性的时候被调用。
如果试图读取一个对象并不存在的属性的时候,PHP就会给出错误信息。如果在类里添加__get方法,并且我们可以用这个函数实现类似java中反射的各种操作。

class Test
{
     public function __get($key)
    {
         echo $key . " 不存在";
    }
}
$t = new Test();
echo $t->name;

    就会输出:name 不存在

2 魔术方法 __set() 当试图向一个并不存在的属性写入值的时候被调用。

class Test
{
    public function __set($key, $value)
    {
         echo '对' . $key . "附值" . $value;
    }
}
$t = new Test();
$t->name = "aninggo";

    就会输出:对 name 附值 aninggo

3 魔术方法 __call() 当试图调用一个对象并不存在的方法时,调用该方法。

class Test
{
    public function __call($Key, $Args)
    {
         echo "您要调用的 {$Key} 方法不存在。你传入的参数是:" . print_r($Args, true);
    }
}
$t = new Test();
$t->getName(aning, go);

    程序将会输出:
    您要调用的 getName 方法不存在。参数是:Array
    (
    [0] => aning
    [1] => go
    )

4 魔术方法 __toString() 当打印一个对象的时候被调用,这个方法类似于java的toString方法,当我们直接打印对象的时候回调用这个函数。

class Test
{
     public function __toString()
     {
         return "打印 Test";
     }
}

$t = new Test();
echo $t;

    运行echo 的时候,就会调用 __toString(); 从而程序将会输出:打印 Test;

5 魔术方法__clone() 当对象被克隆时,被调用。

class Test
{
     public function __clone()
     {
         echo "我被复制了!";
     }
}
$t = new Test();
$t1 = clone $t;

    程序输出:我被复制了!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python的魔术方法是以双下划线开头和结尾的方法,也被称为Magic Method(魔术方法)。这些方法在Python中具有特殊的功能和行为。魔术方法包括类的初始化方法__init__、比较方法、数值处理方法、普通算术操作符等等。魔术方法的作用是为了增强类的功能和灵活性,使对象能够具有更复杂的行为和操作。比如__init__方法用于初始化一个对象的状态,__str__方法定义了对象在被str()函数调用时的行为,__repr__方法定义了对象在被repr()函数调用时的行为等等。通过合理使用魔术方法,我们可以更好地控制和定制自己的类和对象的行为。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [python的魔术方法大全](https://blog.csdn.net/qq_40236497/article/details/125539436)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [Python魔术方法详解](https://download.csdn.net/download/weixin_38501610/12879041)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值