PHP 十六大魔术方法学习
2016-11-22 14:23
260 查看
PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用。 魔术方法包括:
__construct(),类的构造函数
__destruct(),类的析构函数
__call(),在对象中调用一个不可访问方法时调用
__callStatic(),用静态方式中调用一个不可访问方法时调用
__get(),获得一个类的成员变量时调用
__set(),设置一个类的成员变量时调用
__isset(),当对不可访问属性调用isset()或empty()时调用
__unset(),当对不可访问属性调用unset()时被调用。
__sleep(),执行serialize()时,先会调用这个函数
__wakeup(),执行unserialize()时,先会调用这个函数
__toString(),类被当成字符串时的回应方法
__invoke(),调用函数的方式调用一个对象时的回应方法
__set_state(),调用var_export()导出类时,此静态方法会被调用。
__clone(),当对象复制完成时调用
__autoload(),尝试加载未定义的类
__debugInfo(),打印所需调试信息
从本片文章开始,我和大家一起来学习一下上面的这些魔术方法。
方法体 //通常用来对成员属性进行初始化赋值
}
延伸:关于类的构造函数,我们还可以自定义,具体如下:
如果在上面的Student类定义中同时包含了两个构造函数,那当类实例化的时候会调用哪一个呢?修改一下代码。
运行效果如下:
OK,看到结果了,还是调用了系统默认的构造函数。
总结:
(1)系统默认构造函数和用户自定义的构造函数只能存在一个,只要显示定义了__construct构造函数,就会调用它,不论你是否定义了其他的构造函数。
(2)php不支持方法的重载,同样是类的构造函数。
析构方法允许在销毁一个类之前执行的一些操作或完成一些功能,比如说关闭文件、释放结果集等。
析造方法的声明格式与构造方法 __construct() 比较类似,也是以两个下划线开始的方法 __destruct() ,这种析构方法名称也是固定的。
注意:析构函数不能带有任何参数。
具体效果可以看上面的图片,末尾已经进行了输出。
总结:php中有垃圾回收机制,可以结合析构函数使用。
该方法有两个参数,第一个参数 $function_name 会自动接收方法名,第二个 $arguments 则以数组的方式接收方法的多个参数。
private $name;
private $age;
private $sex;
/**
* 构造函数
*/
public function __construct($name,$age,$sex)
{
echo "this is __construct function!\r\n";
$this->sex=$sex;
$this->age=$age;
$this->name=$name;
}
public function Student($name,$age,$sex)
{
echo "this is Student function!";
$this->sex=$sex;
$this->age=$age;
$this->name=$name;
}
public function __destruct()
{
echo "this is the destruct function!";
}
public function Read()
{
echo "this is read function!\r\n";
}
public function __call($functionname,$arguments)
{
echo "您调用的".$functionname."方法不存在\r\n";
}
private function Hello()
{
echo "this is Hello function!\r\n";
}
protected function Smile()
{
echo "this is Smile function!\r\n";
}
}
总结:__call()函数对于严谨的开发是必要的
OK,今天先学习一下上面的三个函数,剩余的会在下面的文章中共同学习。
__construct(),类的构造函数
__destruct(),类的析构函数
__call(),在对象中调用一个不可访问方法时调用
__callStatic(),用静态方式中调用一个不可访问方法时调用
__get(),获得一个类的成员变量时调用
__set(),设置一个类的成员变量时调用
__isset(),当对不可访问属性调用isset()或empty()时调用
__unset(),当对不可访问属性调用unset()时被调用。
__sleep(),执行serialize()时,先会调用这个函数
__wakeup(),执行unserialize()时,先会调用这个函数
__toString(),类被当成字符串时的回应方法
__invoke(),调用函数的方式调用一个对象时的回应方法
__set_state(),调用var_export()导出类时,此静态方法会被调用。
__clone(),当对象复制完成时调用
__autoload(),尝试加载未定义的类
__debugInfo(),打印所需调试信息
从本片文章开始,我和大家一起来学习一下上面的这些魔术方法。
一、__construct
php中构造方法是对象创建完成后第一个被对象自动调用的方法。在每个类中都有一个构造方法,如果没有显示地声明它,那么类中都会默认存在一个没有参数且内容为空的构造方法。1、 构造方法的作用
通常构造方法被用来执行一些有用的初始化任务,如对成员属性在创建对象时赋予初始值。2、 构造方法的在类中的声明格式
function __constrct([参数列表]){方法体 //通常用来对成员属性进行初始化赋值
}
3、代码实例
class Student { private $name; private $age; private $sex; /** * 构造函数 */ public function __construct($name,$age,$sex) { $this->sex=$sex; $this->age=$age; $this->name=$name; } public function __destruct() { echo "this is the destruct function!"; } }
$stu=new Student('lily',20,0); var_dump($stu);
延伸:关于类的构造函数,我们还可以自定义,具体如下:
public function Student($name,$age,$sex) { $this->sex=$sex; $this->age=$age; $this->name=$name; }
如果在上面的Student类定义中同时包含了两个构造函数,那当类实例化的时候会调用哪一个呢?修改一下代码。
public function __construct($name,$age,$sex) { echo "this is __construct function!\r\n"; $this->sex=$sex; $this->age=$age; $this->name=$name; } public function Student($name,$age,$sex) { echo "this is Student function!"; $this->sex=$sex; $this->age=$age; $this->name=$name; }
运行效果如下:
OK,看到结果了,还是调用了系统默认的构造函数。
总结:
(1)系统默认构造函数和用户自定义的构造函数只能存在一个,只要显示定义了__construct构造函数,就会调用它,不论你是否定义了其他的构造函数。
(2)php不支持方法的重载,同样是类的构造函数。
二、__destruct
析构方法是PHP5才引进的新内容。析构方法允许在销毁一个类之前执行的一些操作或完成一些功能,比如说关闭文件、释放结果集等。
析造方法的声明格式与构造方法 __construct() 比较类似,也是以两个下划线开始的方法 __destruct() ,这种析构方法名称也是固定的。
(1) 析构方法的声明格式
function __destruct() { //方法体 }
注意:析构函数不能带有任何参数。
(2) 析构方法的作用
一般来说,析构方法在PHP中并不是很常用,它属类中可选择的一部分,通常用来完成一些在对象销毁前的清理任务。(3)代码实例
public function __destruct() { echo "this is the destruct function!"; }
具体效果可以看上面的图片,末尾已经进行了输出。
总结:php中有垃圾回收机制,可以结合析构函数使用。
三、__call
有时候,我们不确定某个类中是否存在某方法(面向对象的封装),可是我们又想调用,同时在改方法不存在时不能报错,程序可以继续运行下去,那如何操作呢?没错,这个时候就需要__call()函数了。该方法有两个参数,第一个参数 $function_name 会自动接收方法名,第二个 $arguments 则以数组的方式接收方法的多个参数。
(1) __call() 方法的格式:
function __call(string $function_name, array $arguments) { // 方法体 }
(2) __call() 方法的作用
避免当调用的方法不存在时产生错误,而意外的导致程序中止,可以使用 __call() 方法来避免。该方法在调用的方法不存在时会自动调用,程序仍会继续执行下去。(3)代码实例
class Student {private $name;
private $age;
private $sex;
/**
* 构造函数
*/
public function __construct($name,$age,$sex)
{
echo "this is __construct function!\r\n";
$this->sex=$sex;
$this->age=$age;
$this->name=$name;
}
public function Student($name,$age,$sex)
{
echo "this is Student function!";
$this->sex=$sex;
$this->age=$age;
$this->name=$name;
}
public function __destruct()
{
echo "this is the destruct function!";
}
public function Read()
{
echo "this is read function!\r\n";
}
public function __call($functionname,$arguments)
{
echo "您调用的".$functionname."方法不存在\r\n";
}
private function Hello()
{
echo "this is Hello function!\r\n";
}
protected function Smile()
{
echo "this is Smile function!\r\n";
}
}
$stu=new Student('lily',20,0); $stu->Read(); $stu->Smile(); $stu->Hello(); $stu->Talk();
总结:__call()函数对于严谨的开发是必要的
OK,今天先学习一下上面的三个函数,剩余的会在下面的文章中共同学习。
相关文章推荐
- Php魔术方法学习实例
- PHP学习(十八)--常见的关键字和魔术方法
- 【小白笔记】PHP学习之路 (21) --对象 魔术方法、变量 序列化
- PHP魔术方法学习笔记
- [php学习笔记]与类有关的魔术方法、魔术常量、系统函数
- php学习笔记------[php面向对象中常用关键字与魔术方法]
- php魔术方法,设计模式的学习
- php深入学习二——魔术方法以及__call的调用
- PHP学习笔记——魔术方法
- php学习笔记------[php面向对象中常用关键字与魔术方法]
- PHP学习(二):PHP的魔术方法
- php 魔术方法学习笔记
- PHP中的魔术方法
- PHP下划线函数即魔术方法汇总
- php魔术方法和魔术变量 详细说明
- PHP 5魔术方法应用浅析
- 腾讯php面试题总结(一) 15个魔术方法的总结
- php魔术方法
- 分享一下我5个小时学会jQuery的方法,同样适用于学习PHP
- PHP中魔术方法