php面向对象全攻略 (九)访问类型
2018-10-15 17:26
                        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,总之子类中的 
方法总是要高于或等于父类被覆盖方法的访问权限。                    
下一篇:PHP下的浮点运算不准的解决方法