类型的访问修饰符允许开发人员对类成员的访问进行限制,这是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 |
| -- | -- | -- | -- |
| 同一个类中 | √ | √ | √ |
| 类的子类中 | | √ | √ |
| 所有的外部成员 | | | √ |
属性访问控制示例:
~~~
1 <?php
2 /**
3 * Define MyClass
4 */
5 class MyClass
6 {
7 public $public = 'Public';
8 protected $protected = 'Protected';
9 private $private = 'Private';
10
11 function printHello() {
12 echo $this->public;
13 echo $this->protected;
14 echo $this->private;
15 }
16 }
17
18 $obj = new MyClass();
19 echo $obj->public; // Works
20 echo $obj->protected; // Fatal Error
21 echo $obj->private; // Fatal Error
22 $obj->printHello(); // Shows Public, Protected and Private
23
24 /**
25 * Define MyClass2
26 */
27 class MyClass2 extends MyClass
28 {
29 // We can redeclare the public and protected method, but not private
30 protected $protected = 'Protected2';
31
32 function printHello() {
33 echo $this->public;
34 echo $this->protected;
35 echo $this->private;
36 }
37 }
38
39 $obj2 = new MyClass2();
40 echo $obj->public; // Works
41 echo $obj2->private; // Undefined
42 echo $obj2->protected; // Fatal Error
43 $obj2->printHello(); // Shows Public, Protected2, not Private
44 ?>
~~~
方法访问控制示例:
~~~
1 <?php
2 /**
3 * Define MyClass
4 */
5 class MyClass
6 {
7 // Contructors must be public
8 public function __construct() { }
9
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 $this->MyPublic();
22 $this->MyProtected();
23 $this->MyPrivate();
24 }
25 }
26
27 $myclass = new MyClass;
28 $myclass->MyPublic(); // Works
29 $myclass->MyProtected(); // Fatal Error
30 $myclass->MyPrivate(); // Fatal Error
31 $myclass->Foo(); // Public, Protected and Private work
32
33 /**
34 * Define MyClass2
35 */
36 class MyClass2 extends MyClass
37 {
38 // This is public
39 function Foo2() {
40 $this->MyPublic();
41 $this->MyProtected();
42 $this->MyPrivate(); // Fatal Error
43 }
44 }
45
46 $myclass2 = new MyClass2;
47 $myclass2->MyPublic(); // Works
48 $myclass2->Foo2(); // Public and Protected work, not Private
49 ?>
~~~
另外在子类覆盖父类的方法时也要注意一点,子类中方法的访问权限一定不能低于父类被覆盖方法的访问权限,也就是一定要高于或等于父类方法的访问权限。
例如,如果父类方法的访问权限是protected,那么子类中要覆盖的权限就要是protected和public,如果父类的方法是public那么子类中要覆盖的方法只能也是public,总之子类中的方法总是要高于或等于父类被覆盖方法的访问权限。
- 1.什么是面向对象
- 2.什么是类,什么是对象,类和对象这间的关系
- 3.什么是面向对象编程呢
- 4.如何抽象出一个类
- 5.如何实例化对象
- 6.如何去使用对象中的成员
- 7.特殊的引用this的使用
- 8.构造方法__construct()与析构方法__destruct()
- 9.封装性(var与public,protected,private的关系)
- 10.__set(),__get(),__isset(),__unset()四个方法的应用
- 11.类的继承
- 12.重载新的方法(parent::)
- 13.访问类型(public,protected,private)
- 14.final关键字的应用
- 15.static和const关键字的使用(self::)
- 16.__toString()方法
- 17.克隆对象__clone()方法
- 18.__call()处理调用错误
- 19.抽象方法和抽象类(abstract)
- 20.PHP5接口技术(interface)
- 21.多态的应用
- 22.把对象串行化serialize()方法,__sleep()方法,__wakeup()方法
- 23.自动加载类 __autoload()函数