五分钟带你了解PHP中的魔术方法(实例详解)

在之前的文章中给大家带来了《PHP中clone关键字和__clone()方法的使用(实例详解)》,其中给大家详细的介绍了PHP中的clone关键字和__clone()方法,本篇文章继续给大家带来PHP中的魔术方法,希望对大家有帮助!

在之前的文章中给大家带来了《PHP中clone关键字和__clone()方法的使用(实例详解)》,其中给大家详细的介绍了PHP中的clone关键字和__clone()方法,本篇文章继续给大家带来PHP中的魔术方法,希望对大家有帮助!

五分钟带你了解PHP中的魔术方法(实例详解)

php入门到就业线上直播课:进入学习API 文档、设计、调试、自动化测试一体化协作工具:点击使用

在我们之前的文章中,我们介绍__clone()方法的时候提到,这是魔术方法的一种,《带你分清类中的构造函数与析构函数》中也提到的构造函数与析构函数也叫作构造方法与析构方法,他们也是魔术方法的一种。那么什么是魔术方法?它有哪些常用的方法?它又是怎样使用的?接下来我们一起来看一看吧。

PHP魔术方法

在PHP面向对象编程中,PHP里有一系列的魔术方法,这些魔术方法看看之前学习的__clone\__construct\__destruct我们能发现一个共同点,那就是它们都是由__两个下划线开始的,并且都是在某种特定的条件下自动调用的。

那接下来我们来看一看一些常用的魔术方法,结合实例来看一下它们的使用方法。

__set()方法

__set()方法用于在为当前环境下未定义或不可见的类属性赋值时,需要注意的是所有的魔术方法,都是在某种特定条件下自动调用的,为当前环境下未定义或不可见的类属性赋值时就是__set()方法调用的特定条件。

语法格式如下:

public function __set(要操作的变量, 要操作变量的值){
… … ;
}登录后复制

实例如下:

study1 = ;好好学习;;
$object -> study2 = ;天天向上;;
$object -> study3 = ;福如东海;;
?>登录后复制

输出结果:

五分钟带你了解PHP中的魔术方法(实例详解)

由上述实例看出,当当前环境下未定义或不可见的类属性赋值时,就会调用__set()方法。

__get()方法

自动调用 __get() 方法的特定条件是在调用或获取当前环境下未定义或不可见的类属性时,定义该方法的语法格式如下:

public function __get($name){
… … ;
}登录后复制

其中参数$name表示要操作的变量名称,下面通过实例我们来看一下__get()方法的使用,实例如下:

study.;;;
echo $object -> study1.;;;
echo $object -> study2.;;;
?>登录后复制

输出结果:

五分钟带你了解PHP中的魔术方法(实例详解)

由上述结果可以看出在调用或获取当前环境下未定义或不可见的类属性时,会自动调用 __get() 方法。

__isset() 方法

自动调用 __isset() 方法的特定条件是当在类外部对类中不可访问或不存在的属性使用 isset() 或 empty() 函数时,该方法的语法格式如下:

public function __isset($name){
… … ;
}登录后复制

其中我们需要注意的是:

参数 $name 为要访问的属性名称。

  • isset() 函数是用来检查一个变量是否存在并且还要判断不为 NULL,如果传入的变量存在则传回 true,不存在传回 false。

  • empty() 函数是用来检查一个变量是否为空,如果变量的值等于 FALSE,那么这个变量会被认为不存在。

  • 如果想要使用 isset() 或 empty() 函数对类中的私有属性进行检测的话,我们只需要在类中添加一个 __isset() 方法就可以了,当在类外部使用 isset() 或 empty() 函数时,会自动调用类里面的 __isset() 方法。

接下来我们通过实例来看一下__isset()方法的使用,实例如下:

mother);
isset($object -> name);
?>登录后复制

输出结果:

五分钟带你了解PHP中的魔术方法(实例详解)

其中我们需要注意的是,property_exists() 函数可以用来检测类中是否定义了该属性,语法格式为

property_exists($class_name,$property_name)登录后复制

其中 $class_name 为字符串形式的类名,即判断类 class_name 中是否定义了 property_name 属性。

__unset() 方法

自动调用__unset() 方法的特定条件是当在类外部对类中不可访问或不存在的属性使用 unset() 函数时,该方法的语法格式如下:

public function __unset($name){
… … ;
}登录后复制

其中我们需要注意的是:

  • 参数 $name 为要访问的属性名称。

  • unset() 函数的作用是删除指定的变量,需要传入一个或多个变量作为参数,另外,该函数没有返回值。

  • 可以使用 unset() 函数在类外部去删除类中的成员属性。如果要删除类中的公有属性的话直接使用 unset() 函数即可;

  • 如果要删除类中的私有属性的话,则需要在类中添加一个 __unset() 方法。

接下来我们通过实例来看一下__unset()方法的使用,实例如下:

$study);
echo ;移除成员属性:“;.$study.;”成功!;;
}else{
echo ;成员属性:“;.$study.;”不存在!;;
}
}
}
$object = new father();
unset($object->name);
unset($object->study);
unset($object->study1);
?>登录后复制

输出结果:

五分钟带你了解PHP中的魔术方法(实例详解)

由上述实例看出当在类外部对类中不可访问或不存在的属性使用 unset() 函数时,__unset() 方法会被自动调用。

上述实例中给大家介绍了一些常用的魔术方法,但这并不是魔术方法的全部,那接下来再给大家列举一些魔术方法:

  • __call() — 调用一个不存在的方法时自动调用

  • __sleep() — 使用 serialize 序列化时自动调用

  • __toString() — 把对象转换成字符串时自动调用

  • __invoke() — 当尝试把对象当方法调用时自动调用

  • __wakeup() — 使用 unserialize 反序列化时自动调用

  • __callStatic() — 调用一个不存在的静态方法时自动调用

  • __debugInfo() — 使用 var_dump() 打印对象信息时自动调用

  • __set_state() — 当使用 var_export() 函数时自动调用,接受一个数组参数

大家如果感兴趣的话,可以点击《PHP视频教程》进行更多关于PHP知识的学习。

php中魔术方法和魔术常量是什么

原创2021-06-21 18:31:321565 + php学习QQ群(点击入群)

在php中,魔术方法是指以两个下划线“__”开头的方法,例如“__call()”、“__get()”、“__set()”等;魔术常量是指会随着他们所在代码位置的变化而变化的8个常量,例如“__LINE__”、“__FILE__”等。

五分钟带你了解PHP中的魔术方法(实例详解)

php入门到就业线上直播课:进入学习API 文档、设计、调试、自动化测试一体化协作工具:点击使用

本教程操作环境:windows7系统、PHP7.1版,DELL G3电脑

魔术方法(Magic methods)

PHP中把以两个下划线__开头的方法称为魔术方法,这些方法在PHP中充当了举足轻重的作用。 魔术方法包括:

  • __construct(),类的构造函数
  • __destruct(),类的析构函数
  • __call(),在对象中调用一个不可访问方法时调用
  • __callStatic(),用静态方式中调用一个不可访问方法时调用
  • __get(),获得一个类的成员变量时调用
  • __set(),设置一个类的成员变量时调用
  • __isset(),当对不可访问属性调用isset()或empty()时调用
  • __unset(),当对不可访问属性调用unset()时被调用。
  • __sleep(),执行serialize()时,先会调用这个函数
  • __wakeup(),执行unserialize()时,先会调用这个函数
  • __toString(),类被当成字符串时的回应方法
  • __invoke(),调用函数的方式调用一个对象时的回应方法
  • __set_state(),调用var_export()导出类时,此静态方法会被调用。
  • __clone(),当对象复制完成时调用

__construct()和__destruct()

构造函数和析构函数应该不陌生,他们在对象创建和消亡时被调用。例如我们需要打开一个文件,在对象创建时打开,对象消亡时关闭

handle = fopen(…);
}

function __destruct(){
fclose($this->handle);
}
}
?>登录后复制

这两个方法在继承时可以扩展,例如:

登录后复制

__call()和__callStatic()

在对象中调用一个不可访问方法时会调用这两个方法,后者为静态方法。这两个方法我们在可变方法(Variable functions)调用中可能会用到。

runTest('in object context');
MethodTest::runTest('in static context');
?>登录后复制

__get(),__set(),__isset()和__unset()

当get/set一个类的成员变量时调用这两个函数。例如我们将对象变量保存在另外一个数组中,而不是对象本身的成员变量

data[$name] = $value;
}

public function __get($name){
if(array_key_exists($name, $this->data))
return $this->data[$name];
return NULL;
}

public function __isset($name){
return isset($this->data[$name])
}

public function unset($name){
unset($this->data[$name]);
}
}
?>登录后复制

__sleep()和__wakeup()

当我们在执行serialize()和unserialize()时,会先调用这两个函数。例如我们在序列化一个对象时,这个对象有一个数据库链接,想要在反序列化中恢复链接状态,则可以通过重构这两个函数来实现链接的恢复。例子如下:

server = $server;
$this->username = $username;
$this->password = $password;
$this->db = $db;
$this->connect();
}

private function connect()
{
$this->link = mysql_connect($this->server, $this->username, $this->password);
mysql_select_db($this->db, $this->link);
}

public function __sleep()
{
return array('server', 'username', 'password', 'db');
}

public function __wakeup()
{
$this->connect();
}
}
?>登录后复制

__toString()

对象当成字符串时的回应方法。例如使用echo $obj;来输出一个对象

登录后复制

这个方法只能返回字符串,而且不可以在这个方法中抛出异常,否则会出现致命错误。

__invoke()

调用函数的方式调用一个对象时的回应方法。如下

登录后复制

__set_state()

调用var_export()导出类时,此静态方法会被调用。

var1 = $an_array['var1'];
$obj->var2 = $an_array['var2'];
return $obj;
}
}

$a = new A;
$a->var1 = 5;
$a->var2 = 'foo';
var_dump(var_export($a));
?>登录后复制

__clone()

当对象复制完成时调用。例如在设计模式详解及PHP实现:单例模式一文中提到的单例模式实现方式,利用这个函数来防止对象被克隆。

登录后复制

魔术常量(Magic constants)

PHP中的常量大部分都是不变的,但是有8个常量会随着他们所在代码位置的变化而变化,这8个常量被称为魔术常量。

  • __LINE__,文件中的当前行号
  • __FILE__,文件的完整路径和文件名
  • __DIR__,文件所在的目录
  • __FUNCTION__,函数名称
  • __CLASS__,类的名称
  • __TRAIT__,Trait的名字
  • __METHOD__,类的方法名
  • __NAMESPACE__,当前命名空间的名称

这些魔术常量常常被用于获得当前环境信息或者记录日志。

以上就是php中魔术方法和魔术常量是什么的详细内容,更多请关注钦钦技术栈其它相关文章!

转载至:php中文网【www.php.cn】

版权声明:本文(即:原文链接:https://www.qin1qin.com/catagory/27519/)内容由互联网用户自发投稿贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 630367839@qq.com 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022年 9月 30日 3:49:58
下一篇 2022年 9月 30日 3:51:16

软件定制开发公司

相关阅读

发表回复

登录后才能评论
通知:禁止投稿所有关于虚拟货币,币圈类相关文章,发现立即永久封锁账户ID!