Discuz教程网

PHP面向对象全攻略 (九)访问类型

[复制链接]
authicon dly 发表于 2011-9-8 19:38:14 | 显示全部楼层 |阅读模式
13.访问类型
类型的访问修饰符允许开发人员对类成员的访问进行限制,这是PHP5 的新特性,但却
是OOP 语言的一个好的特性。而且大多数OOP 语言都已支持此特性。PHP5 支持如下3 种访
问修饰符
public (公有的、默认的),private (私有的)和protected (受保护的)三种。
public 公有修饰符,类中的成员将没有访问限制,所有的外部成员都可以访问(读和写)
这个类成员(包括成员属性和成员方法),在PHP5 之前的所有版本中,PHP 中类的成员都是
public 的,而且在PHP5 中如果类的成员没有指定成员访问修饰符,将被视为public。
例:public $name;
public function say(){};
private 私有修改符,被定义为private 的成员,对于同一个类里的所有成员是可见的,即
是没有访问限制;但对于该类的外部代码是不允许改变甚至读操作,对于该类的子类,也不
能访问private 修饰的成员。
例:private $var1 = ‘A'; //属性
private function getValue(){} //函数
protected 保护成员修饰符,被修饰为protected 的成员不能被该类的外部代码访问。但是
对于该类的子类有访问权限,可以进行属性、方法的读及写操作,该子类的外部代码包括其的
子类都不具有访问其属性和方法的权限。
例:protected $name;
protected function say(){};
private protected public
同一个类中 √ √ √
类的子类中 √ √
所有的外部成员 √
代码片段
代码如下:

  1. <?php
  2. /**
  3. * Define MyClass
  4. */
  5. class MyClass{
  6. public $public = 'Public';
  7. protected $protected = 'Protected';
  8. private $private = 'Private';
  9. function printHello(){
  10. echo $this->public;
  11. echo $this->protected;
  12. echo $this->private;
  13. }
  14. }
  15. $obj = new MyClass();
  16. echo $obj->public; //Works
  17. echo $obj->protected; // Fatal Error
  18. echo $obj->private; // Fatal Error
  19. $obj->printHello(); // Shows Public, Protected and Private
  20. /**
  21. * Define MyClass2
  22. */
  23. class MyClass2 extends MyClass{
  24. //We can redeclare the public and protected method, but not private
  25. protected $protected = 'Protected2';
  26. function printHello(){
  27. echo $this->public;
  28. echo $this->protected;
  29. echo $this->private;
  30. }
  31. }
  32. $obj2 = new MyClass2();
  33. echo $obj->public; //Works
  34. echo $obj2->private; // Undefined
  35. echo $obj2->protected; // Fatal Error
  36. $obj2->printHello(); // Shows Public, Protected2, not Private
  37. ?>
复制代码

代码片段

代码如下:

  1. <?php
  2. /**
  3. * Define MyClass
  4. */
  5. class MyClass{
  6. // Contructors must be public
  7. public function __construct() { }
  8. // Declare a public method
  9. public function MyPublic() { }
  10. // Declare a protected method
  11. protected function MyProtected() { }
  12. // Declare a private method
  13. private function MyPrivate() { }
  14. // This is public
  15. function Foo() {
  16. $this->MyPublic();
  17. $this->MyProtected();
  18. $this->MyPrivate();
  19. }
  20. }
  21. $myclass = new MyClass;
  22. $myclass->MyPublic(); //Works
  23. $myclass->MyProtected(); // Fatal Error
  24. $myclass->MyPrivate(); // Fatal Error
  25. $myclass->Foo(); // Public, Protected and Private work
  26. /**
  27. * Define MyClass2
  28. */
  29. class MyClass2 extends MyClass{
  30. // This is public
  31. function Foo2(){
  32. $this->MyPublic();
  33. $this->MyProtected();
  34. $this->MyPrivate(); // Fatal Error
  35. }
  36. }
  37. $myclass2 = new MyClass2;
  38. $myclass2->MyPublic(); // Works
  39. $myclass2->Foo2(); // Public and Protected work, not Private
  40. ?>
复制代码

另外在子类覆盖父类的方法时也要注意一点,子类中方法的访问权限一定不能低于父类
被覆盖方法的访问权限,也就是一定要高于或等于父类方法的访问权限。
例如,如果父类方法的访问权限是protected 那么子类中要覆盖的权限就要是protected
和public,如果父类的方法是public 那么子类中要覆盖的方法只能也是public,总之子类中的
方法总是要高于或等于父类被覆盖方法的访问权限。



上一篇:PHP面向对象全攻略 (八)重载新的方法
下一篇:PHP面向对象全攻略 (十) final static const关键字的使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-8-2 15:06

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表