四、访问控制
对属性或方法的访问控制,是通过在前面添加关键字 public、protected 或 private 来实现的。由 public 所定义的类成员可以在任何地方被访问;由 protected 所定义的类成员则可以被其所在类的子类和父类访问(当然,该成员所在的类也可以访问);而由 private 定义的类成员则只能被其所在类访问。
1、对类成员的访问控制
类成员都必须使用关键字public、protected 或 private 进行定义
Example#1 声明类成员
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; // 未定义 privateecho $obj2 -> protected; // 这行会产生一个致命错误$obj2 -> printHello(); // 输出 Public、Protected2,但不会输出 Privateclass Bar { public function test() { $this -> testPrivate(); $this -> testPublic(); } public function testPublic() { echo "Bar::testPublic\n"; } private function testPrivate() { echo "Bar::testPrivate\n"; } } class Foo extends Bar { public function testPublic() { echo "Foo::testPublic\n"; } private function testPrivate() { echo "Foo::testPrivate\n"; } } $myFoo = new foo();$myFoo -> test(); // Bar::testPrivate // Foo::testPublic?>
Note: 为了兼容性考虑,在 PHP 4 中使用 var 关键字对变量进行定义的方法在 PHP 5 中仍然有效(只是作为 public 关键字的一个别名)。在 PHP 5.1.3 之前的版本,该语法会产生一个 E_STRICT 警告。
2、对方法的访问控制
类中的方法都必须使用关键字public、protected 或 private 进行定义。如果没有设置这些关键字,则该方法会被设置成默认的 public。
Example#2 声明类中的方法
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 不会被调用?>