最新消息:

PHP _set 和 _get 方法

编程 2055浏览

在 PHP 5 中,预定义了两个函数“__get()”和“__set()”来获取和赋值其属性,对每个字段进行 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 G:\bak\temp\tempcode\_sg.php on line 7

所报错误大致是说,不能访问 Account 对象的私有属性 user。在上述代码的类定义里增加以下代码,其中使用了 _set 魔术方法。

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;
}

再次运行,看到正常输出,没有报错。在类里以两个下画线开头的方法都属于魔术方法(除非是你自定义的),它们是 PHP 中的内置方法,有特殊含义。手册里把这两个方法归到重载。

PHP 的重载和 Java 等语言的重载不同。Java 里,重载指一个类中可以定义参数列表不同但名字相同的多个方法。比如,Java 也有构造函数,Java 允许有多个构造函数,只要保证方法签名不一样就行;而 PHP 则在一个类中只允许有一个构造函数。

PHP 提供的“重载”指动态地“创建”类属性和方法。因此,_set 和 _get 方法被归到重载里。

这里可以直观看到,若类中定义了_set和_get这一对魔术方法,那么当给对象属性赋值或者取值时,即使这个属性不存在,也不会报错,一定程度上增强了程序的健壮性。

我们注意到,在 account 类里,user 属性的访问权限是私有的,私有属性意味着这个属性是类的“私有财产”,只能在类内部对其进行操作。如果没有 _set 这个魔术方法,直接在类的外部对属性进行赋值操作是会报错的,只能通过在类中定义一个 public 的方法,然后在类外调用这个公开的方法进行属性读写操作。

现在有了这两个魔术方法,是不是对私有属性的操作变得更方便了呢?实际上,并没有什么奇怪的,因为这两个方法本身就是 public 的。它们和在对外的 public 方法中操作 private 属性的原理一样。只不过这对魔术方法使其操作更简单,不需要显式地调用一个 public 的方法,因为这对魔术方法在操作类变量时是自动调用的。当然,也可以把类属性定义成 public 的,这样就可以随意在类的外部进行读写。不过,如果只是为了方便,类属性在任意时候都定义成 public 权限显然是不合适的,也不符合面向对象的设计思想。

好了,PHP _set 和 _get 方法 就分享到这里,非常感谢你的来访。如果你很喜欢本站,请不要忘记收藏本站,以便下次继续访问;也可以 关注站长微博 随时获取最新动态。你的支持就是我最大的动力!

转载请注明:爱维科斯 » PHP _set 和 _get 方法

支付宝打赏支付宝打赏 微信打赏微信打赏

如果文章对你有帮助,欢迎点击上方按钮打赏作者