访问控制
2022-10-18 22:07:08内容摘要
访问控制
对属性或方法的访问控制,是通过在前面添加关键字 public、protected 或 private 来实现的。由 public 所定义的类成员可以在任何地方被访问;由 protected 所定义的类成员则可以被其所在类的子类和父类访问(当然,该成员所在的类也可以访问);而由 private 定义的类成员则只能被其所在类访问。
对属性或方法的访问控制,是通过在前面添加关键字 public、protected 或 private 来实现的。由 public 所定义的类成员可以在任何地方被访问;由 protected 所定义的类成员则可以被其所在类的子类和父类访问(当然,该成员所在的类也可以访问);而由 private 定义的类成员则只能被其所在类访问。
文章正文
访问控制
对属性或方法的访问控制,是通过在前面添加关键字 public、protected 或 private 来实现的。由 public 所定义的类成员可以在任何地方被访问;由 protected 所定义的类成员则可以被其所在类的子类和父类访问(当然,该成员所在的类也可以访问);而由 private 定义的类成员则只能被其所在类访问。
对类成员的访问控制
类成员都必须使用关键字public、protected 或 private 进行定义
Example #1 声明类成员
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | <code><?php /** * Define MyClass */ 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 /** * Define MyClass2 */ 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 $obj -> public ; // 这行能被正常执行 echo $obj2 -> private ; // 未定义 private echo $obj2 -> protected ; // 这行会产生一个致命错误 $obj2 ->printHello(); // 输出 Public、Protected2,但不会输出 Private class Bar { public function test() { $this ->testPrivate(); $this ->testPublic(); } public function testPublic() { echo "Bar::testPublic " ; } private function testPrivate() { echo "Bar::testPrivate " ; } } class Foo extends Bar { public function testPublic() { echo "Foo::testPublic " ; } private function testPrivate() { echo "Foo::testPrivate " ; } } $myFoo = new foo(); $myFoo ->test(); // Bar::testPrivate // Foo::testPublic ?></code> |
Note: 为了兼容性考虑,在 PHP 4 中使用 var 关键字对变量进行定义的方法在 PHP 5 中仍然有效(只是作为 public 关键字的一个别名)。在 PHP 5.1.3 之前的版本,该语法会产生一个 E_STRICT 警告。
对方法的访问控制
类中的方法都必须使用关键字public、protected 或 private 进行定义。如果没有设置这些关键字,则该方法会被设置成默认的 public。
Example #2 声明类中的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | <code><?php /** * Define MyClass */ class MyClass { // 构造函数必须是 public public function __construct() { } // 声明一个 public 的方法 public function MyPublic() { } // 声明一个 protected 的方法 protected function MyProtected() { } // 声明一个 private 的方法 private function MyPrivate() { } // 这个方法也是 public 的 function Foo() { $this ->MyPublic(); $this ->MyProtected(); $this ->MyPrivate(); } } $myclass = new MyClass; $myclass ->MyPublic(); // 这行能被正常执行 $myclass ->MyProtected(); // 这行会产生一个致命错误 $myclass ->MyPrivate(); // 这行会产生一个致命错误 $myclass ->Foo(); // Public、Protected 和 Private 都被调用了 /** * Define MyClass2 */ class MyClass2 extends MyClass { // This is public function Foo2() { $this ->MyPublic(); $this ->MyProtected(); $this ->MyPrivate(); // 这行会产生一个致命错误 } } $myclass2 = new MyClass2; $myclass2 ->MyPublic(); // 这行能被正常执行 $myclass2 ->Foo2(); // Public 和 Protected 都被调用了,但 Private 不会被调用 ?></code> |
代码注释