PHP 常用魔术方法
一、 __construct(),类的构造函数
php中构造方法是对象创建完成后第一个被对象自动调用的方法。在每个类中都有一个构造方法,如果没有显示地声明它,那么类中都会默认存在一个没有参数且内容为空的构造方法。
1、 构造方法的作用
通常构造方法被用来执行一些有用的初始化任务,如对成员属性在创建对象时赋予初始值。
2、 构造方法的在类中的声明格式
function __constrct([参数列表]){
方法体 //通常用来对成员属性进行初始化赋值
}
在类中声明构造方法需要注意的事项:
1、在同一个类中只能声明一个构造方法,原因是,PHP不支持构造函数重载。
2、构造方法名称是以两个下画线开始的__construct()
<?php
class Student{
public $name;
public $age = 18;
//显示声明一个构造方法且带参数
public function __construct($n,$age){
$this->name = $n;
$this->age = $age;
}
public function info(){
echo '我是:'.$this->name.' 今年:'.$this->age;
}
}
$obj = new Student('张三',20);
$obj->info();
二、__destruct(),类的析构函数
析构方法允许在销毁一个类之前执行的一些操作或完成一些功能,比如说关闭文件、释放结果集等。
析构方法是PHP5才引进的新内容,与构造方法对应
析造方法的声明格式与构造方法
__construct()
比较类似,也是以两个下划线开始的方法__destruct()
,这种析构方法名称也是固定的。
1、 析构方法的声明格式
function __destruct(){
//方法体
}
注意:析构函数不能带有任何参数。
2、 析构方法的作用
一般来说,析构方法在PHP中并不是很常用,它属类中可选择的一部分,通常用来完成一些在对象销毁前的清理任务。
<?php
class Student{
public $name;
public $age = 18;
//显示声明一个构造方法且带参数
public function __construct($n,$age){
$this->name = $n;
$this->age = $age;
}
public function info(){
echo '我是:'.$this->name.' 今年:'.$this->age.'<br>';
}
//析构函数
public function __destruct(){
echo "销毁 " . $this->name . "<br>";
}
}
$obj = new Student('张三',20);
$obj->info();
三、 __call(),在对象中调用一个不可访问方法时调用。
该方法有两个参数,第一个参数
$function_name
会自动接收不存在的方法名,第二个$arguments
则以数组的方式接收不存在方法的多个参数。
1、 __call()
方法的格式:
function __call(string $function_name, array $arguments){
// 方法体
}
2、 __call()
方法的作用:
为了避免当调用的方法不存在时产生错误,而意外的导致程序中止,可以使用
__call()
方法来避免。该方法在调用的方法不存在时会自动调用,程序仍会继续执行下去。
<?php
class Student{
//私有的成员属性
private $name = "张三";
private $age = 24;
// 当访问不存在或不可访问的方法时,魔术方法__call()自动调用
// 参数:$func是传递过来的方法名称,$arrs是传递过来的参数数组
public function __call($func,$arrs){
echo "方法{$func}(".implode(',', $arrs).")不存在或不可访问!";
}
}
//创建学生类对象
$obj = new Student();
// 调用对象中不存在的方法,则自动调用了对象中的__call()方法
$obj->showInfo("张三",24);
四、 __callStatic(),用静态方式中调用一个不可访问方法时调用
此方法与上面所说的 call() 功能除了
callStatic()
是未静态方法准备的之外,其它都是一样的。
<?php
class Student{
//私有的成员属性
private $name = "张三";
private $age = 24;
//用静态化方式访问不存在或不可访问的方法时,魔术方法__callStatic()自动调用
//参数:$func是传递过来的方法名称,$args是传递过来的参数数组
public static function __callStatic($func,$args)
{
echo "方法{$func}(".implode(',',$args).")不存在或不可访问!";
}
}
//用静态化方法调用showInfo()方法
Student::showInfo('张三',24,'男');
五、 __get(),获得一个类的成员变量时调用
在 php 面向对象编程中,类的成员属性被设定为
private
后,如果我们试图在外面调用它则会出现“不能访问某个私有属性”的错误。那么为了解决这个问题,我们可以使用魔术方法__get()
。魔术方法__get()的作用:
在程序运行过程中,通过它可以在对象的外部获取私有成员属性的值。
<?php
class Student{
// 私有的成员属性
private $name = "张三";
private $age = 24;
// 当访问不可访问是属性时,__get()魔术方法会自动调用
public function __get($n){
return $this->$n;
}
}
// 创建学生类对象
$obj = new Student();
// 访问私有的属性
echo "{$obj->name}的年龄是{$obj->age}岁";
?>
六、 __set(),设置一个类的成员变量时调用
__set( $property, $value )
方法用来设置私有属性, 给一个未定义的属性赋值时,此方法会被触发,传递的参数是被设置的属性名和值。
<?php
class Student{
// 私有的成员属性
private $name = "张三";
private $age = 24;
// 当给不可访问的属性赋值时,__set()魔术方法自动调用
public function __set($n,$v){
$this->$n = $v;
}
}
// 创建学生类对象
$obj = new Student();
// 修改私有属性
$obj->name = '李四';
$obj->age = 22;
var_dump($obj);
?>
七、 __isset()
__isset()
的作用:当对不可访问属性调用 isset() 或 empty() 时,__isset()
会被调用。
<?php
class Student{
//私有的成员属性
private $name = "张三";
private $age = 24;
// 当对不可访问的属性应用isset()或者empty()时,__isset()会自动调用
public function __isset($n){
return isset($this->$n);
}
}
// 创建学生类对象
$obj = new Student();
// 判断私有属性是否存在
if(isset($obj->name)){
echo "存在";
}else{
echo "不存在或不可访问";
}
?>
八、 __unset(),当对不可访问属性调用unset()时被调用。
在对象里面加上了
__unset()
这个方法之后,在对象外部使用“unset()”函数删除对象内部的私有成员属性时,对象会自动调用__unset()
函数来帮我们删除对象内部的私有成员属性。
<?php
class Student{
//私有的成员属性
private $name = "张三";
private $age = 24;
// 当对私有的属性应用unset()时,魔术方法__unset()自动调用
public function __unset($n){
unset($this->$n);
}
}
//创建学生类对象
$obj = new Student();
// 删除对象属性
unset($obj->name);
var_dump($obj);