PHP面向对象之----SET和GET

PHP web 开发第三版中,对于__SET()和__GET()大概是这么说的:

在一个类中,可以访问一个特殊的指针—$this。如果当前类的一个属性为$attribute,则当该类中通过一个操作设置或访问该变量时,可以使用$this -> attribute来引用。

如下说明了如何在一个类中设置和访问属性:

class classname
{
  var $attribute;
  function operation($param)
  {
    $this -> attribute = $param;
    echo $this -> attribute;
  }
}

是否可以在类的外部访问一个属性是由访问修饰符来确定的,关于访问修饰符以后详细介绍(我先说一下,public就是共有,private就是私有,私有只能在类的内部访问,
protected是保护的,只能在类的内部或这个类的子类内访问下面这个例子没有对属性设置限制的访问,因此可以按照如下所示的方式从类的外部访问属性:

class classname
{
  var $attribute;
}
$a = new classname();
$a -> attribute = 'value';
echo $a -> attribute;


通常,从类的外部直接访问类的属性试糟糕的想法。面向对象方法的一个优点就是鼓励使用封装。可以通过使用__GET(),__SET()函数来实现对属性的访问。
)(顺 便我说一下,对于没有接触过面向对象编程的初学者来说可能会误认为 $a是一个classname的实例,那么$a调用一个private的属性应该是可以的吧,这样应该不叫类外吧?这样理解是不对的。类内,类外就是指类 的定义部分而言,在这个定义(大花括号之内)部分内的就是类内。)
书中大概就是这么说的,后面还有一个例子,只不过是实例化了一个类,然后再设置或访问这个类实例的属性而已。我把例子直接帖出来,大家一看就明白了

class classname
{
  var $attribute;

  function __GET($name)
  {
    return $this -> $name;//注意,设置的时候name前要加$符号
  }
  function __SET($name, $value)
  {
    $this -> $name = $value;
  }
}
$a = new classname();
$a -> attribute = 5;

echo $a -> attribute;

那么,我想说的是,如果有两个属性,是不是照样可以识别呢?(因为C#等中的get,set是对每一个属性分别设置的,所以我想测试一下)。我测试的代码如下:

<?php

class test
{
 var $name;
 var $age;

 function __set($name,$value)
 {
  $this->$name = $value ;
 }

 function __get($name)
 {
  return $this->$name;
 }

}


$a = new test();
$a -> name = 5;
echo $a->name . "<br/>" ;

$a -> age = "12";
echo $a->age;
?>

不出所料,输出结果是,5 和 12。

这时,我想在输入名字$name这个属性的时候自动添加一个字符串进去,可以吗?于是我修改__SET函数为如下:

 function __set($name,$value)
 {
  if ($name == 'name')
    $this->$name = $value + 'yyf';
  else
    $this->$name = $value ;
}

测试: 结果还是 5 和 12。为什么呢?
我认为可能是因为定义属性的关键字 var 的问题,于是,我修改var 为 private,再测试就正常了!

后来,我又接着把访问修饰符改为public,protected测试,发现如果是 public 的就又不行了,而protected则正确。

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值