类型的访问修饰符允许开发人员对类成员的访问进行限制,这是PHP5的新特性,但却是OOP语言的一个好的特性。而且大多数OOP语言都已支持此特性。PHP5支持如下3种访问修饰符:
public (公有的、默认的),protected (受保护的)和private (私有的)三种。
public 公有修饰符,类中的成员将没有访问限制,所有的外部成员都可以访问(读和写)这个类成员(包括成员属性和成员方法),在PHP5之前的所有版本中,PHP 中类的成员都是public的,而且在PHP5中如果类的成员没有指定成员访问修饰符,将被视为public 。例:
1 |
public $name ; |
2 |
public function say(){
}; |
private 私有修改符,被定义为private的成员,对于同一个类里的所有成员是可见的,即没有访问限制;但对于该类的外部代码是不允许改变甚至读操作,对于该类的子类,也不能访问private修饰的成员。例:
1 |
private $var1 = 'A' ; //
属性 |
2 |
private function getValue(){
} //
函数 |
类内部访问方式为:$this->var1,$this->getValue()
protected保护成员修饰符,被修饰为protected的成员不能被该类的外部代码访问。但是对于该类的子类有访问权限,可以进行属性、方法的读及写操作,该子类的外部代码包括其的子类都不具有访问其属性和方法的权限。
例:
1 |
protected $name ; |
2 |
protected function say(){
}; |
private | protected | public | |
同一个类中 | √ | √ | √ |
类的子类中 | √ | √ | |
所有的外部成员 | √ |
属性访问控制示例:
01 |
<?php |
02 |
/** |
03 |
*
Define MyClass |
04 |
*/ |
05 |
class MyClass |
06 |
{ |
07 |
public $public = 'Public' ; |
08 |
protected $protected = 'Protected' ; |
09 |
private $private = 'Private' ; |
10 |
11 |
function printHello() |
12 |
{ |
13 |
echo $this -> public ; |
14 |
echo $this -> protected ; |
15 |
echo $this -> private ; |
16 |
} |
17 |
} |
18 |
19 |
$obj = new MyClass(); |
20 |
echo $obj -> public ; //
Works |
21 |
echo $obj -> protected ; //
Fatal Error |
22 |
echo $obj -> private ; //
Fatal Error |
23 |
$obj ->printHello(); //
Shows Public, Protected and Private |
24 |
25 |
/** |
26 |
*
Define MyClass2 |
27 |
*/ |
28 |
class MyClass2 extends MyClass |
29 |
{ |
30 |
//
We can redeclare the public and protected method, but not private |
31 |
protected $protected = 'Protected2' ; |
32 |
33 |
function printHello() |
34 |
{ |
35 |
echo $this -> public ; |
36 |
echo $this -> protected ; |
37 |
echo $this -> private ; |
38 |
} |
39 |
} |
40 |
41 |
$obj2 = new MyClass2(); |
42 |
echo $obj -> public ; //
Works |
43 |
echo $obj2 -> private ; //
Undefined |
44 |
echo $obj2 -> protected ; //
Fatal Error |
45 |
$obj2 ->printHello(); //
Shows Public, Protected2, not Private |
46 |
?> |
方法访问控制示例:
01 |
<?php |
02 |
/** |
03 |
*
Define MyClass |
04 |
*/ |
05 |
class MyClass |
06 |
{ |
07 |
//
Contructors must be public |
08 |
public function __construct()
{ } |
09 |
10 |
//
Declare a public method |
11 |
public function MyPublic()
{ } |
12 |
13 |
//
Declare a protected method |
14 |
protected function MyProtected()
{ } |
15 |
16 |
//
Declare a private method |
17 |
private function MyPrivate()
{ } |
18 |
19 |
//
This is public |
20 |
function Foo() |
21 |
{ |
22 |
$this ->MyPublic(); |
23 |
$this ->MyProtected(); |
24 |
$this ->MyPrivate(); |
25 |
} |
26 |
} |
27 |
28 |
$myclass = new MyClass; |
29 |
$myclass ->MyPublic(); //
Works |
30 |
$myclass ->MyProtected(); //
Fatal Error |
31 |
$myclass ->MyPrivate(); //
Fatal Error |
32 |
$myclass ->Foo(); //
Public, Protected and Private work |
33 |
34 |
/** |
35 |
*
Define MyClass2 |
36 |
*/ |
37 |
class MyClass2 extends MyClass |
38 |
{ |
39 |
//
This is public |
40 |
function Foo2() |
41 |
{ |
42 |
$this ->MyPublic(); |
43 |
$this ->MyProtected(); |
44 |
$this ->MyPrivate(); //
Fatal Error |
45 |
} |
46 |
} |
47 |
48 |
$myclass2 = new MyClass2; |
49 |
$myclass2 ->MyPublic(); //
Works |
50 |
$myclass2 ->Foo2(); //
Public and Protected work, not Private |
51 |
?> |
另外在子类覆盖父类的方法时也要注意一点,子类中方法的访问权限一定不能低于父类被覆盖方法的访问权限,也就是一定要高于或等于父类方法的访问权限。
例如,如果父类方法的访问权限是protected,那么子类中要覆盖的权限就要是protected和public,如果父类的方法是public那么子类中要覆盖的方法只能也是public,总之子类中的方法总是要高于或等于父类被覆盖方法的访问权限。