PHP学习笔记3——重载和魔术方法
重载的概念
- 在其他编程语言中,面向对象的重载是指。方法有相同名称,但是参数列表不相同的情形,但PHP不支持同名函数或同名方法。
- PHP所提供的“重载”(overloading)是指动态地“创建”属性和方法,通过魔术方法来实现的。
- 当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。
- 所有重载方法都必须被声明为public
- 属性重载只能在对象中进行。
- 在静态方法中,这些魔术方法将不能被声明为static。
属性重载
使用魔术方法
1. __get()
描述:读取不可访问属性的值时,__get()会被调用。
语法:public mixed__get(string name)
例子代码:
<?php
class Student
{
//私有的成员属性
private $name="张三";
private $age=21;
//当访问不可访问属性值时,__get()魔术方法会自动调用
public function __get($n)
{
return $this->$n;
}
}
//创建学生类对象
$obj=new Student();
//访问私有属性
echo "{$obj->name}的年龄是{$obj->age}岁。";
2. __set()
描述:再给不可访问属性赋值时,__set()会被调用。
语法:public void__set(string $name,mixed $value)
例子代码:
//当给不可访问属性赋值时,__set()方法会自动调用
public function __set($n,$v)
{
$this->$n=$v;
}
//修改私有属性
$obj->name="李四";
$obj->age=20;
3. __isset()
描述:在给不可访问属性调用isset()或empty()时,__isset()会被调用。
语法:public bool __isset(string $name)
例子代码:
//当对不可访问属性应用isset()或empty()时。__isset()会自动调用
public function __isset($n)
{
return isset($this->$n);
}
//判断私有属性是否存在
if(isset($obj->name))
{
echo "存在";
}else
{
echo "不存在或不可访问";
}
4.__unset()
描述:当对不可访问属性调用unset时,__unset()会自动调用。
语法:public void__unset(string $name)
例子代码:
//当对私有属性调用unset时,__unset()会自动调用
public function __unset($n)
{
unset($this->$n);
}
//删除对象属性
unset($obj->name);
方法重载
使用魔术方法
1. __call()
描述:在对象调用一个不可访问方法时,__call()会被调用。
语法:public mixed__call(string $name,array $arguments)
代码例子:
//当访问一个不存在或不可访问方法时,__call()会被调用
//参数:$func是传递过来的方法名称,$args是传递过来的参数数组
public function __call($func,$args)
{
echo "方法{$func}(".implode(',', $args).")不存在或不可访问!";
}
//调用一个不存在的方法
$obj->showInfo("张三",21);
2. __callStatic()
描述:用静态方法调用一个不可访问方法时,__callStatic()会被调用。
语法:public static mixed __callStatic (string $name,array $arguments)
代码例子:
//用静态方法调用一个不存在或不可访问方法时,__callStatic()会被调用
//参数:$func是传递过来的方法名称,$args是传递过来的参数数组
public static function __callStatic($func,$args)
{
echo "static方法{$func}(".implode(',', $args).")不存在或不可访问!";
}
//用静态化方式调用showInfo方法
Student::showInfo();