访问控制(可见性)
对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。被定义为公有的类成员可以在任何地方被访问。被定义为受保护的类成员则可以被其自身以及其子类和父类访问。被定义为私有的类成员则只能被其定义所在的类访问。
1、类属性必须定义为公有,受保护,私有之一
受保护属性可以被子类继承或重载,私有属性不能被继承,受保护的和私有的都不能在类外部直接访问
class MyClass
{
public $public = 'Public';
protected $protected = 'Protected';
private $private = 'Private';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj = new MyClass();
echo $obj->public; // 这行能被正常执行
echo $obj->protected; // 这行会产生一个致命错误
echo $obj->private; // 这行也会产生一个致命错误
$obj->printHello(); // 输出 Public、Protected 和 Private
class MyClass2 extends MyClass
{
// 可以对 public 和 protected 进行重定义,但 private 而不能
protected $protected = 'Protected2';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj2 = new MyClass2();
echo $obj2->public; // 这行能被正常执行
echo $obj2->private; // 未定义 private
echo $obj2->protected; // 这行会产生一个致命错误
$obj2->printHello(); // 输出 Public、Protected2 和 Undefined
2、类中的方法可以被定义为公有,私有或受保护。如果没有设置这些关键字,则该方法默认为公有。
私有方法不能被继承且不能被重载
方法中的参数前面如果有类名约束的话,参数则是该类的一个实例
同一个类的对象即使不是同一个实例也可以互相访问对方的私有与受保护成员。这是由于在这些对象的内部具体实现的细节都是已知的。
class Test
{
private $foo;
public function __construct($foo)
{
$this->foo = $foo;
}
private function bar()
{
echo 'Accessed the private method.';
}
public function baz(Test $other)
{
// We can change the private property:
$other->foo = 'hello';
var_dump($other->foo);
// We can also call the private method:
$other->bar();
}
}
$test = new Test('test');
$test->baz(new Test('other'));
/*
string(5) "hello"
Accessed the private method.
*/
一、封装性
- 把对象的全部成员属性和成员方法结合在一起,形成一个不可分割的独立单位(即对象)
- 信息隐蔽,即尽可能隐蔽对象的内部细节,只保留有限的对外接口使之与外部发生联系
封装的原则就是要求对象以外的部分不能随意存取对象的内部数据(成员属性和方法)
private、protected、public
如果不让用户在对象的外部设置私有属性的值,但可以获取私有属性的值,或者允许用户对私有属性赋值,但需要限制一些赋值的条件,解决的办法就是在对象的内部声明一些操作私有属性的公有方法。
二、继承性 extends
当扩展一个类,子类就会继承父类所有公有的和受保护的方法。除非子类覆盖了父类的方法,被继承的方法都会保留其原有功能。
除非使用了自动加载,否则一个类必须在使用之前被定义。如果一个类扩展了另一个,则父类必须在子类之前被声明。此规则适用于类继承其它类与接口。
1、继承性就是通过子类对已存在的父类(基类)进行功能扩展
2、增加了代码的可重用性
3、php只支持单继承,即一个类只能直接从另一个类中继承数据,但一个类可以有多个子类
4、在子类重载的方法中调用父类中被覆盖方法的功能。这样就可以在子类重写的方法中继承使用父类中继承过来并被覆盖的方法,然后再按要求多添加一些新功能。格式是parent::方法名
5、在子类中重写的方法的访问权限一定不能低于父类被覆盖的方法的访问权限