php面向对象全攻略 (九)访问类型
程序员文章站
2022-06-12 18:25:45
13.访问类型 类型的访问修饰符允许开发人员对类成员的访问进行限制,这是php5 的新特性,但却 是oop 语言的一个好的特性。而且大多数oop 语言都已支持此特性。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,总之子类中的
方法总是要高于或等于父类被覆盖方法的访问权限。
类型的访问修饰符允许开发人员对类成员的访问进行限制,这是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,总之子类中的
方法总是要高于或等于父类被覆盖方法的访问权限。
上一篇: 咸鸭蛋的热量低,但减肥的人建议少吃
下一篇: 吃米粉减肥吗?米粉的热量高吗?