php的魔术方法
前言??Php可以说是1个面向对象的语言,php的类中有自己独有的1些方法,不同于别的编程语言,php在定义类中除我们自己定义的属性方法之外,Php还有1写魔术方法,当我们把这些方法写出来后,我们其实不需要自己去调用。系统就会在触发某些条件以后自动调用。 ??注意,当我们没有写这些魔术方法时,系统不会去调用这些魔术方法。 php提供的魔术方法有很多,这里我们只介绍经常使用的几个。
??你会发现这些魔术方法的前面都有两个下划线__这是由于PHP 将所有以 __(两个下划线)开头的类方法保存为魔术方法。所以在定义类方法时,除上述魔术方法,建议不要以 __ 为前缀。 下面我们单个的介绍每一个魔术方法是怎样使用的。 魔术方法__get()和__set()??__get():读取不可访问或不存在的属性的值时,__get() 会被调用。 ??__set():在给不可访问或不存在的属性赋值时,__set() 会被调用。 ??在类中当属性的修饰符是protected和private的时候,在类的外部不能通过对象名的情势进行访问,如果强行读取不可访问的属性,并且你在类的内部写了__get函数,这时候候系统就会自动的调用__get魔术方法,当你强行修改不可访问属性值得时候,__set魔术方法就会被履行。 示例:
property_exists()函数:检查对象或类是不是具有该属性 __isset()和__unset()??__isset():当对不可访问或不存在属性调用isset() 或 empty() 时,__isset() 会被调用。 ??__unset():当对不可访问或不存在的属性调用 unset() 时,__unset() 会被调用。 ??在类的外部对对象的不能访问属性使用isset函数或empty函数的时候或这个属性在类中都没有定义。魔术方法__isset()就会履行,而进行unset操作是__unset就会自动调用。 示例:
__call()??__isset():在对象中调用1个不可访问或不存在的方法时,__call() 会被调用。 ??由于php语言不支持函数的重载,可使用这个魔术方法进行重载。 示例:
在php中同1类中1定不能有方法名相同的函数。不然后报错。 __clone()??__clone():可以避免他人克隆我们的对象。 ??php语言中有1种机制叫做克隆,如果定义了 __clone()方法,则新创建的对象(复制生成的对象)中的 __clone()方法会被调用。 示例:
??注意在这里魔术方法的权限修饰符是private,私有的。 __tostring()??__tostring方法用于1个类被当做字符串时应怎样回应。例如 echo $obj; ??当我们尝试把1个对象当做字符换进行echo输出的时候,类的tostring方法就会默许被调用,在这个方法中我们可以定义对象应当输出甚么。 示例:
??注意:在tostring中必须要有1个返回值。 __construct()??__construct():PHP 5 允行开发者在1个类中定义1个方法作为构造函数。具有构造函数的类会在每次创建新对象时先调用此方法。 ??在类中定义构造函数1般是完成创建对象时,对象的初始化。当我们没有定义构造方法的时候,系统会调用他自己默许的构造函数,这个构造函数是1个无参的构造函数。 示例
__destruct()??__destruct();PHP 5 引入了析构函数的概念,析构函数会在到某个对象的所有援用都被删除或当对象被显式烧毁时履行。 ??析构函数会在函数烧毁前履行,在这里面我们可以对用到的资源进行释放,比如数据库。 示例 <?php
class DaoMysql{
protected $link;
public function __construct($host,$user,$pwd){
$this -> link = @mysql_connect($host,$pwd);
}
public function getLink(){
return $this -> link;
}
//析构函数,用来释放数据库资源。
public function __destruct(){
mysql_close($this->link);
}
}
$daoMysql = new DaoMysql('localhost','root','123456');
$sql = 'select * from tb1';
mysql_select_db('test');
mysql_query('set names utf8');
//通过对象的到里面的链接对象。
$res = mysql_query($sql,$daoMysql -> getLink());
echo '<pre>';
while($row = mysql_fetch_assoc($res)){
var_dump($row);
}
//当类中没有析构函数的时候,把对象置为空,下面的获得数据还能履行,
//当类中有析构函数的时候,把对象置为空,下面的获得数据会出错。说明成功的在析构方法中把数据库连接释放掉了。
$daoMysql = null;
$res = mysql_query($sql);
echo '<pre>';
while($row = mysql_fetch_assoc($res)){
var_dump($row);
} 总结在php中,这些魔术方法大多数都是我们操作不可操作的数据时,系统触发履行。区分于别的语言,也能够说是php的1大特点。(- _ -); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |