php魔法函数用途,PHP常见魔法函数

PHP常见魔法函数:

__construct()

实例化对象时被调用, 当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用。

__destruct()

当删除一个对象或对象操作终止时被调用。

__call()

对象调用某个方法, 若方法存在,则直接调用;若不存在,则会去调用__call函数。

__get()

读取一个对象的属性时,若属性存在,则直接返回属性值; 若不存在,则会调用__get函数。

__set()

设置一个对象的属性时, 若属性存在,则直接赋值;

若不存在,则会调用__set函数。

__toString()

打印一个对象的时被调用。

__clone()

克隆对象时被调用。

__autoload()  或 spl_autoload_register()

实例化一个对象时,如果对应的类不存在,则该方法被调用。

重点来讲几个魔法函数:

注意:魔法函数只会在某个节点动作时被触发这个魔法函数的执行而不是自动执行某个逻辑,魔法函数的内部逻辑逻辑实现均需要自己按需编写。

1、__autoload()

自动加载是当今框架的必备良药。节省了很多依赖导入的代码编写,为程序员的懒提供了进一步的支持。不用写一堆的require包含文件语句了。

new找不到类文件的时候用类名为参自动调用这个函数去查找文件位置。如下。$db =new DB();

function __autoload($className)

{

require $className .'.php';

}

但是如果一个项目过大,或者需要不同的自动加载来加载不同路径的文件,这个时候__autoload就悲剧了,原因是一个项目中仅能有一个这样的 __autoload() 函数,因为 PHP 不允许函数重名。于是spl_autoload_register()登场了。function load1($className)

{

echo 1;

if(is_file($className .'.php')){

require $className .'.php';

}

}

function load2($className)

{

echo 2;

if(is_file('./app/'. $className .'.php')){

require'./app/'. $className .'.php';

}

}

function __autoload($className)

{

echo 3;

if(is_file('./lib/'. $className .'.php')){

require'./lib/'. $className .'.php';

}

}

//注册了3个

spl_autoload_register('load1');

spl_autoload_register('load2');

spl_autoload_register('__autoload');//不注册则失效

$db =new DB();//DB就在本目录下

$info =newInfo();//Info 在/lib/Info.php

需要注意的是,如果你同时使用spl_autoload_register和__autoload,__autoload会失效!!! 再说了,本来就是替换它的,就一心使用spl_autoload_register就好了。

我们注册了3个自动加载函数。执行结果是啥呢?1Hello DB

123Hello Info

new DB的时候,就按照注册顺序,先去找load1()函数了,发现找到了,就停止了,所以输出1 Hello Word

new Info的时候,先是安装注册顺序,先找load1(), 所以输出了1,发现没找到,就去load2()里面去找,所以输出了2,还是没这个文件,就去__autoload()函数里找,所以,先输出了3,再输出Hello Info

注意,前面说过,spl_autoload_register使用时,__autoload会无效,有时候,我们希望它继续有效,就可以也将它注册进来,就可以继续使用。

2、__call()class Test

{

public function set($key, $value, $expire = 0)

{

}

public function __call($Key, $Args) //$Key为调用函数,$Args为参数数组 ,比如$key = set,$Args = [$key,$value, $expire ]

{

echo "您要调用的 {$Key} 方法不存在。你传入的参数是:" . print_r($Args, true);

}

}

$t = new Test();

$t->getName(aning, go);

再比如我们可以和call_user_func_array函数配合使用。当两个类不是继承关系,是依赖关系的时候(A依赖B)。如果调用子类B中的一个函数,但子类中没有重写父类A的该函数的时候,就直接调用父类A的该函数。如下:

316d73d2e6a3

3、__get()

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

{

public function __get($key)

{

echo $key . " 不存在";

}

}

$t = new Test();

echo $t->name;

4、__toString()

316d73d2e6a3

316d73d2e6a3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值