四、访问控制
对属性或方法的访问控制,是通过在前面添加关键字 public、protected 或 private 来实现的。由 public 所定义的类成员可以在任何地方被访问;由 protected 所定义的类成员则可以被其所在类的子类和父类访问(当然,该成员所在的类也可以访问);而由 private 定义的类成员则只能被其所在类访问。
1、对类成员的访问控制
类成员都必须使用关键字public、protected 或 private 进行定义
Example#1 声明类成员
- <?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\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 声明类中的方法
- <?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 不会被调用
- ?>