PHP魔术方法
__construst(构造方法)
这个魔术方法又称构造方法。具有构造方法的类会在每次创建对象时先调用此方法。所以非常适用于在使用对象之前做一些初始化工作。往往用于类进行初始化时执行一些初始化操作。
__destrust(析构方法)
对象的所有引用都被删除了或当对象被显式销毁时(unset())执行
class StoreBargain
{
public $age;
public $name;
public function __construct($age,$name)
{
$this->age = $age;
$this->name = $name;
}
public function get()
{
echo $this->age;
echo '<hr>';
echo $this->name;
}
public function __destruct()
{
echo '<hr>';
echo '对象的所有引用都被删除了或当对象被显式销毁时(unset($object))执行';
}
}
$object = new StoreBargain(10,'帅哥');
$object->get();
输出
__set 与__get
PHP提供的 重载指动态的创建类属性和方法。因此,__set与__get方法被归到重载里。
若类中定义了__set与__get方法,那么当给对象创建属性赋值或者取值时,即使这个属性不存在,也不会报错。
class StoreBargain
{
private $age;
public $sex;
public function __set($attr, $value)
{
echo '设置' . $attr . '的属性值';
echo '<hr/>';
$this->$attr = $value;
}
public function __get($attr)
{
echo '<hr/>';
echo '获取' . $attr . '的属性值';
if (!isset($this->$attr)) {
$this->$attr;
}
return $this->$attr;
}
}
$object = new StoreBargain();
echo '<hr>';
$object->age = '10';
echo $object->age;
echo '<hr>';
$object->sex = 1;
echo $object->sex;
echo '<hr>';
$object->attr = '帅哥';
echo $object->attr;
输出结果
这个可以看到几点要点
1、对于私有属性age 在为其赋值或获取值得时候都会走__set与__get方法,保护该属性,不允许外部直接修改与获取,只能通过本类进行获取与修改,这也体现了面向对象的封装性原则。
2、对于公有的属性外部可直接修改与获取,不走__set与__get
3、对于类中没有定义的属性,在为属性赋值时会走__set方法,但在读取时不会调用__set,新创建的属性权限为public。
__call 与__callStatic
__call : 当调用一个不存在的方法时会自动调用
__callStatic: 当调用一个不存在的静态方法时会自动调用
class StoreProduct
{
public function __call($method, $args)
{
echo '调用了一个不存在的方法: '.$method;
dump($args);
}
public static function __callStatic($method, $arguments)
{
echo '调用了一个不存在的静态方法: '.$method;
dump($arguments);
}
}
$storeProduct = new StoreProduct();
$storeProduct->noExisteMethod('10','帅哥');
$storeProduct::noExisteStaticMethod('18','大帅哥');
输出
所以当被调用的类中有了这两个方法时,即使调用了类中不存在的方法。也不会报错。
当然,使用魔术方法防止调用不存在的方法而报错,并不是魔术方法的本意。实际上,魔术方法使方法的动态创建变为可能。
__toString
当进行测试时,需要知道是否得出正确的数据。比如打印一个对象时,看看这个对象都有哪些属性,其值是什么,如果类定义了toString方法,就能在测试时,echo 打印对象实体,对象就会自动调用它所属类定义的toString方法,格式化输出这个对象所包含的数据。
class StoreProduct
{
public $age;
public $name;
public function __construct($age, $name)
{
$this->age = $age;
$this->name = $name;
}
public function __toString()
{
return '当前对象的age:' . $this->age . ',当前对象的name' . $this->name;
}
}
$storeProduct = new StoreProduct(18,'帅哥');
echo $storeProduct;
输入