访问控制

对属性或方法的访问控制,是通过在前面添加关键字 public、protected 或 private 来实现的。由 public 所定义的类成员可以在任何地方被访问;由 protected 所定义的类成员则可以被其所在类的子类和父类访问(当然,该成员所在的类也可以访问);而由 private 定义的类成员则只能被其所在类访问。

对类成员的访问控制

类成员都必须使用关键字public、protected 或 private 进行定义

例 10.9. 声明类成员

<?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; // &#36825;&#34892;&#33021;&#34987;&#27491;&#24120;&#25191;&#34892;
echo $obj->protected; // &#36825;&#34892;&#20250;&#20135;&#29983;&#19968;&#20010;&#33268;&#21629;&#38169;&#35823;
echo $obj->private; // &#36825;&#34892;&#20063;&#20250;&#20135;&#29983;&#19968;&#20010;&#33268;&#21629;&#38169;&#35823;
$obj->printHello(); // &#36755;&#20986; Public&#12289;Protected &#21644; Private


/**
* Define MyClass2
*/
class MyClass2 extends MyClass
{
   
// &#21487;&#20197;&#23545; public &#21644; protected &#36827;&#34892;&#37325;&#23450;&#20041;&#65292;&#20294; private &#32780;&#19981;&#33021;
   
protected $protected = 'Protected2';

   function
printHello()
   {
       echo
$this->public;
       echo
$this->protected;
       echo
$this->private;
   }
}

$obj2 = new MyClass2();
echo
$obj->public; // &#36825;&#34892;&#33021;&#34987;&#27491;&#24120;&#25191;&#34892;
echo $obj2->private; // &#26410;&#23450;&#20041; private
echo $obj2->protected; // &#36825;&#34892;&#20250;&#20135;&#29983;&#19968;&#20010;&#33268;&#21629;&#38169;&#35823;
$obj2->printHello(); // &#36755;&#20986; Public&#12289;Protected2&#65292;&#20294;&#19981;&#20250;&#36755;&#20986; Private

?>
注意:

在 PHP 4 中使用 var 关键字对变量进行定义的方法在 PHP 5 的面向对象语法中不再使用。为了顾及兼容性,在类中定义一个变量的话,该变量会被自动设为 public,并且产生一个 E_STRICT 警告。

对方法的访问控制

类中的方法都必须使用关键字public、protected 或 private 进行定义。如果没有设置这些关键字,则该方法会被设置成默认的 public。

例 10.10. 声明类中的方法

<?php
/**
* Define MyClass
*/
class MyClass
{
   
// &#26500;&#36896;&#20989;&#25968;&#24517;&#39035;&#26159; public
   
public function __construct() { }

   
// &#22768;&#26126;&#19968;&#20010; public &#30340;&#26041;&#27861;
   
public function MyPublic() { }

   
// &#22768;&#26126;&#19968;&#20010; protected &#30340;&#26041;&#27861;
   
protected function MyProtected() { }

   
// &#22768;&#26126;&#19968;&#20010; private &#30340;&#26041;&#27861;
   
private function MyPrivate() { }

   
// &#36825;&#20010;&#26041;&#27861;&#20063;&#26159; public &#30340;
   
function Foo()
   {
       
$this->MyPublic();
       
$this->MyProtected();
       
$this->MyPrivate();
   }
}

$myclass = new MyClass;
$myclass->MyPublic(); // &#36825;&#34892;&#33021;&#34987;&#27491;&#24120;&#25191;&#34892;
$myclass->MyProtected(); // &#36825;&#34892;&#20250;&#20135;&#29983;&#19968;&#20010;&#33268;&#21629;&#38169;&#35823;
$myclass->MyPrivate(); // &#36825;&#34892;&#20250;&#20135;&#29983;&#19968;&#20010;&#33268;&#21629;&#38169;&#35823;
$myclass->Foo(); // Public&#12289;Protected &#21644; Private &#37117;&#34987;&#35843;&#29992;&#20102;


/**
* Define MyClass2
*/
class MyClass2 extends MyClass
{
   
// This is public
   
function Foo2()
   {
       
$this->MyPublic();
       
$this->MyProtected();
       
$this->MyPrivate(); // &#36825;&#34892;&#20250;&#20135;&#29983;&#19968;&#20010;&#33268;&#21629;&#38169;&#35823;
   
}
}

$myclass2 = new MyClass2;
$myclass2->MyPublic(); // &#36825;&#34892;&#33021;&#34987;&#27491;&#24120;&#25191;&#34892;
$myclass2->Foo2(); // Public &#21644; Protected &#37117;&#34987;&#35843;&#29992;&#20102;&#65292;&#20294; Private &#19981;&#20250;&#34987;&#35843;&#29992;
?>