php 魔术方法

方法一: __contruct()
作用:在每次类被实例化的时候被调用

<?php
class Index
{
    //魔术方法 __contruct
    public function __construct()
    {
        echo "123";
    }
}

$index= new Index();
//执行结果 页面显示123

方法二:__call($function_name,$args)
作用:在对象中调用一个不可访问方法时调用
该方法有两个参数
functionname:访 args : 对不可访问的方法传入的参数值

class Index
{
    public function __call($function_name,$args = array())
    {
        echo $function_name . "<br />" . json_encode($args);
    }

    private function aa(){}
}

$index= new Index();

$index->aa(123,456,"111");

方法三 : __toString()
作用 : 类被当成字符串时的回应方法, 输出的内容需要返回

<?php
class Index
{
    public function __toString()
    {
        return "aaaa";
    }
}

$index= new Index();

echo $index;

方法四 : __destruct()
作用 : 类的析构函数
析构方法允许在销毁一个类之前执行的一些操作或完成一些功能,比如说关闭文件、释放结果集等。
一般来说,析构方法在PHP中并不是很常用,它属类中可选择的一部分,通常用来完成一些在对象销毁前的清理任务。

<?php
class Index
{
    public function __destruct()
    {
        echo "bbbbbb";
    }
}

$index= new Index();
unset($index); //销毁上面创建的对象$Person

方法五 : __get()
作用 : 获得一个类的成员变量时调用
在 php 面向对象编程中,类的成员属性被设定为 private 后,如果我们试图在外面调用它则会出现“不能访问某个私有属性”的错误。那么为了解决这个问题,我们可以使用魔术方法 __get()。
$fieldName : 不能直接方法的属性名

<?php
class Index
{
    private $age = 22;

    public function __get($fieldName)
    {
        return $this->$fieldName;
    }
}

$index= new Index();

echo $index->name;

方法六:__set()
作用 : 设置一个类的成员变量时调用
__set( property, value )` 方法用来设置私有属性, 给一个未定义的属性赋值时,此方法会被触发,传递的参数是被设置的属性名和值。

<?php
class Index
{
    private $name;

    public function __set($fieldName,$value)
    {
        $this->$fieldName = $value;
    }

    public function getName()
    {
        return $this->name;
    }
}

$index= new Index();

$index->name = "谭勇";

echo $index->getName();

方法七 : __isset()
作用 : 当对不可访问属性调用isset()或empty()时调用
在看这个方法之前我们看一下isset()函数的应用,isset()是测定变量是否设定用的函数,传入一个变量作为参数,如果传入的变量存在则传回true,否则传回false。

那么如果在一个对象外面使用isset()这个函数去测定对象里面的成员是否被设定可不可以用它呢?

分两种情况,如果对象里面成员是公有的,我们就可以使用这个函数来测定成员属性,如果是私有的成员属性,这个函数就不起作用了,原因就是因为私有的被封装了,在外部不可见。那么我们就不可以在对象的外部使用isset()函数来测定私有成员属性是否被设定了呢?当然是可以的,但不是一成不变。你只要在类里面加上一个__isset()方法就可以了,当在类外部使用isset()函数来测定对象里面的私有成员是否被设定时,就会自动调用类里面的__isset()方法了帮我们完成这样的操作。

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

<?php
class Index
{
    private $age = 22;

    public function __isset($fieldName)
    {
        echo $fieldName;
    }
}

$index= new Index();

if(isset($index->age))
{

}

方法八 : __unset()
作用 : 当对不可访问属性调用unset()时被调用。
看这个方法之前呢,我们也先来看一下 unset() 函数,unset()这个函数的作用是删除指定的变量且传回true,参数为要删除的变量。

那么如果在一个对象外部去删除对象内部的成员属性用unset()函数可以吗?

这里自然也是分两种情况:

1、 如果一个对象里面的成员属性是公有的,就可以使用这个函数在对象外面删除对象的公有属性。

2、 如果对象的成员属性是私有的,我使用这个函数就没有权限去删除。

虽然有以上两种情况,但我想说的是同样如果你在一个对象里面加上__unset()这个方法,就可以在对象的外部去删除对象的私有成员属性了。在对象里面加上了__unset()这个方法之后,在对象外部使用“unset()”函数删除对象内部的私有成员属性时,对象会自动调用__unset()函数来帮我们删除对象内部的私有成员属性。

<?php
class Index
{
    private $age = 22;

    public function __unset($fieldName)
    {
        echo $fieldName;
    }
}

$index= new Index();

unset($index->age);

方法九 : __sleep()
serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,则该方法会优先被调用,然后才执行序列化操作。

此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。

如果该方法未返回任何内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误。

注意:

__sleep() 不能返回父类的私有成员的名字。这样做会产生一个 E_NOTICE 级别的错误。可以用 Serializable 接口来替代。
作用:

__sleep() 方法常用于提交未提交的数据,或类似的清理操作。同时,如果有一些很大的对象,但不需要全部保存,这个功能就很好用。

<?php
class Index
{
    public $name = "谭勇";

    public function __sleep()
    {
        echo "我被执行了";
        return array('name'); // 这里必须返回一个数值,里边的元素表示返回的属性名称
    }
}

$index= new Index();

echo serialize($index);

方法十 : __wakeup()
作用 : 执行unserialize()时,先会调用这个函数
如果说 __sleep() 是白的,那么 __wakeup() 就是黑的了。

那么为什么呢?

因为:

与之相反,unserialize() 会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源。

作用:

__wakeup() 经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。

<?php
header("content-type:text/html;charset=utf-8");
class Index
{
    public $name = "谭勇";

    public function __sleep()
    {
        echo "我被执行了";
        return array('name'); // 这里必须返回一个数值,里边的元素表示返回的属性名称
    }

    public function __wakeup()
    {
        echo "我是__wakeup";
        $this->name="勇哥";
    }
}

$index= new Index();

$a = serialize($index);
$aindex = unserialize($a);
echo $aindex->name;

方法十一 : __invoke()
作用 : 调用函数的方式调用一个对象时的回应方法
当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。

注意:

本特性只在 PHP 5.3.0 及以上版本有效。

<?php
header("content-type:text/html;charset=utf-8");
class Index
{
    public function  __invoke()
    {
        echo "我是一个对象";
    }
}

$index= new Index();

$index();

方法十二 : __clone()
作用 : 当对象复制完成时调用
在多数情况下,我们并不需要完全复制一个对象来获得其中属性。但有一个情况下确实需要:如果你有一个 GTK 窗口对象,该对象持有窗口相关的资源。你可能会想复制一个新的窗口,保持所有属性与原来的窗口相同,但必须是一个新的对象(因为如果不是新的对象,那么一个窗口中的改变就会影响到另一个窗口)。还有一种情况:如果对象 A 中保存着对象 B 的引用,当你复制对象 A 时,你想其中使用的对象不再是对象 B 而是 B 的一个副本,那么你必须得到对象 A 的一个副本。

作用:

对象复制可以通过 clone 关键字来完成(如果可能,这将调用对象的 __clone() 方法)。对象中的 __clone() 方法不能被直接调用。

语法:

$copy_of_object = clone $object;

注意:

当对象被复制后,PHP 5 会对对象的所有属性执行一个浅复制(shallow copy)。所有的引用属性 仍然会是一个指向原来的变量的引用。

当复制完成时,如果定义了 __clone() 方法,则新创建的对象(复制生成的对象)中的 __clone() 方法会被调用,可用于修改属性的值(如果有必要的话)。

<?php
header("content-type:text/html;charset=utf-8");
class Index
{
    public function __clone()
    {
        echo "你正在克隆我";
    }
}

$index= new Index();
$index_1 = clone $index;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值