对属性或方法的访问控制,是通过在前面添加关键字 public、protected 或 private
来实现的。由 public 所定义的类成员可以在任何地方被访问;由 protected
所定义的类成员则可以被其所在类的子类和父类访问(当然,该成员所在的类也可以访问);而由
private 定义的类成员则只能被其所在类访问。
类成员都必须使用关键字public、protected 或 private 进行定义
例 19-10. 声明类成员
<?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
?>
|
|
注意:
在 PHP 4 中使用 var 关键字对变量进行定义的方法在 PHP 5
的面向对象语法中不再使用。为了顾及兼容性,在类中定义一个变量的话,该变量会被自动设为
public,并且产生一个 E_STRICT 警告。
类中的方法都必须使用关键字public、protected 或 private
进行定义。如果没有设置这些关键字,则该方法会被设置成默认的 public。
例 19-11. 声明类中的方法
<?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 不会被调用 ?>
|
|