set和get方法
set和get方法是比较重要的方法。
例如:
<?php
class Account
{
private $user = 1;
private $pwd = 2;
}
$a = new Account();
echo $a->user;
$a->name = 5;
echo $a->name;
echo $a->big;
运行结果为:
Fatal error: Cannot access private property Account::$user in set_get.php on line 10
报错的意思是说,不能访问Account
对象的私有属性user
。代码修改为如下:
<?php
class Account
{
private $user = 1;
private $pwd = 2;
public function __set($name, $value)
{
echo "Setting $name to $value \r\n";
$this->$name = $value;
}
public function __get($name)
{
if (!isset($this->$name)) {
echo "未设置";
$this->$name = "正在为你设置默认值";
}
return $this->$name;
}
}
$a = new Account();
echo $a->user;
$a->name = 5;
echo $a->name;
echo $a->big;
运行结果为:
1Setting name to 5 5未设置Setting big to 正在为你设置默认值 正在为你设置默认值
__set
和__get
方法为PHP的内置方法,有特殊含义。手册里将他们归到重载。
PHP的重载和Java等语言的重载不同。Java里,重载值一个类中可以定义参数列表不同但名字相同的多个方法。比如Java也有构造函数,Java允许有多个构造函数,只要保证方法签名不一样就行;而PHP则在一个类中只允许有一个构造函数。
PHP提供的”重载”指动态地”创建”类属性和方法。因此,__set
和__get
方法被归到重载里。
这里可以看出,若类中定义了__set
和__get
这一对魔术方法,那么当给对象属性赋值或取值时,即使这个属性不存在,也不会报错,一定程度上增强了程序的健壮性。
我们注意到,在account类里,user属性的访问权限是私有的,只能在类内部对其进行操作。如果没有__set
这个魔术方法,直接在类的外部对属性进行赋值是会报错的,只能通过定义一个public
方法,然后在类外调用这个方法,对属性进行读写操作。
如果用了这两个魔术方法,对私有属性的操作变得更加方便了,它们和在对外的public
方法中操作private
属性的原理一样,这对魔术方法是自动调用的。