php面向对象全攻略 (九)访问类型

13.访问类型

  类型的访问修饰符允许开发人员对类成员的访问进行限制,这是PHP5 的新特性,但却

  是OOP 语言的一个好的特性。而且大多数OOP 语言都已支持此特性。PHP5 支持如下3 种访

  问修饰符

  public (公有的、默认的),private (私有的)和protected (受保护的)三种。

  public 公有修饰符,类中的成员将没有访问限制,所有的外部成员都可以访问(读和写)

  这个类成员(包括成员属性和成员方法),在PHP5 之前的所有版本中,PHP 中类的成员都是

  public 的,而且在PHP5 中如果类的成员没有指定成员访问修饰符,将被视为public。

  例:public $name;

  public function say(){};

  private 私有修改符,被定义为private 的成员,对于同一个类里的所有成员是可见的,即

  是没有访问限制;但对于该类的外部代码是不允许改变甚至读操作,对于该类的子类,也不

  能访问private 修饰的成员。

  例:private $var1 = ‘A'; //属性

  private function getValue(){} //函数

  protected 保护成员修饰符,被修饰为protected 的成员不能被该类的外部代码访问。但是

  对于该类的子类有访问权限,可以进行属性、方法的读及写操作,该子类的外部代码包括其的

  子类都不具有访问其属性和方法的权限。

  例:protected $name;

  protected function say(){};

  private protected public

  同一个类中 √ √ √

  类的子类中 √ √

  所有的外部成员 √

  代码片段

  

复制代码 代码如下:

  <?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; //Works

  echo $obj->protected; // Fatal Error

  echo $obj->private; // Fatal Error

  $obj->printHello(); // Shows Public, Protected and Private

  /**

  * Define MyClass2

  */

  class MyClass2 extends MyClass{

  //We can redeclare the public and protected method, but not private

  protected $protected = 'Protected2';

  function printHello(){

  echo $this->public;

  echo $this->protected;

  echo $this->private;

  }

  }

  $obj2 = new MyClass2();

  echo $obj->public; //Works

  echo $obj2->private; // Undefined

  echo $obj2->protected; // Fatal Error

  $obj2->printHello(); // Shows Public, Protected2, not Private

  ?>

  代码片段

  

复制代码 代码如下:

  <?php

  /**

  * Define MyClass

  */

  class MyClass{

  // Contructors must be public

  public function __construct() { }

  // Declare a public method

  public function MyPublic() { }

  // Declare a protected method

  protected function MyProtected() { }

  // Declare a private method

  private function MyPrivate() { }

  // This is public

  function Foo() {

  $this->MyPublic();

  $this->MyProtected();

  $this->MyPrivate();

  }

  }

  $myclass = new MyClass;

  $myclass->MyPublic(); //Works

  $myclass->MyProtected(); // Fatal Error

  $myclass->MyPrivate(); // Fatal Error

  $myclass->Foo(); // Public, Protected and Private work

  /**

  * Define MyClass2

  */

  class MyClass2 extends MyClass{

  // This is public

  function Foo2(){

  $this->MyPublic();

  $this->MyProtected();

  $this->MyPrivate(); // Fatal Error

  }

  }

  $myclass2 = new MyClass2;

  $myclass2->MyPublic(); // Works

  $myclass2->Foo2(); // Public and Protected work, not Private

  ?>

  另外在子类覆盖父类的方法时也要注意一点,子类中方法的访问权限一定不能低于父类

  被覆盖方法的访问权限,也就是一定要高于或等于父类方法的访问权限。

  例如,如果父类方法的访问权限是protected 那么子类中要覆盖的权限就要是protected

  和public,如果父类的方法是public 那么子类中要覆盖的方法只能也是public,总之子类中的

  方法总是要高于或等于父类被覆盖方法的访问权限。