具体概念讲出来,感觉也不知道说的是什么.其实就是
在类的成员属性和成员方法前面,加上类似public protected private 的修饰符
目的:尽量地隐藏对象的内部细节,达到访问控制.[不是拒绝访问]. (对外形成一个屏障,只保留有限的对外接口与外部发生联系.)
2.封装的原则:
对象对外的部分不能够随意存取对象的内部数据(成员属性和成员方法),从而有效地避免了外部错误对它的"交叉感染",使软件错误能够局部化,大大减小查错和排错的难度.
3.修饰符public protected private
public :公有的,默认的 protected :受保护的 private :私有的
4.访问范围
是否可以访问对应的属性和方法
public | protected | private | |
类的外部 | √ | × | × |
类的内部 | √ | √ | √ |
①类的外部只有公有属性和方法才可以访问.
②其他属性和方法可以在类的内部声明公有方法间接地进行访问.
③在类的内部可以访问公有,私有,受保护的属性和方法.
④在类的内部不可以访问私有和受保护的属性和方法.
如果成员方法没有任何访问控制符,默认是public的,在任何地方都可以访问.(在对象外部就可以公有方法作为访问接口,间接地访问对象的内部细节).
引出这几个魔术方法,首先要说一下,构造方法__construct()没有加关键字修饰,是公有方法(构造方法不要设置成私有的权限)用户可以使用构造方法在实例化对象后为私有属性赋初始值.
但是,我们已经实例化对象,在程序运行过程中想要对私有属性进行赋值操作.有两种方法
(1).在类的内部设置公有方法,专门来提供赋值,取值接口
class Person{ private $name="紫藤"; public function __construct(){ echo $this->name; } //赋值方法 public function setvalue($name){ $this->name=$name; } public function getvalue(){ echo $this->name; } } //实例化 $mod = new Person();
结果是: 紫藤
$mod->setvalue('宝强'); $mod->getvalue();
结果是:宝强
(2)魔术方法__set(),__get(),__isset(),__unset()
如果像上面的每次都要去设置公有方法,很繁琐.在php5.1.0之后的版本中,预定义了__set(),__get(),用来完成对所有非公有属性都能获取和复制的操作.
__set($propertyName,$propertyValue)
有两个参数, 属性名 和 属性值,在给非公有属性赋值时,会自动调用此方法(就是说在类中必须声明__set()) (代码后面补充)
__get($propertyName)在获取非公有属性的值时,会自动调用此方法.
检测非公有属性是否存在__isset(),删除一个对象的非公有属性__unset().为了防止用户主动调用这两个方法,要使用private关键字封装在对象中.
__isset($propertyName)检测非公有属性是否存.(这是一个辅助检测函数,没有检测功能),还要在外部调用isset()函数时,才会自动调用此方法.
__unset($propertyName)删除一个对象的非公有属性_,要在外部调用unset()函数时,才会自动调用此方法.