封装性
- 把对象的全部成员属性和全部成员方法结合在一起,形成一个不可分割的独立单位(即对象)。
信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界〔或者说形成一道屏障),只保留有限的对外接口使之与外部发生联系。 - 信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界〔或者说形成一道屏障),只保留有限的对外接口使之与外部发生联系。
设置私有变量
-
使用private关键字来对成员进行修饰,封装后,成员在对象的外部不能访问,但在对象内部的成员方法中可以进行访问,达到对对象保护的效果
-
一般情况下,为了获得私有成员属性的内容,我们可以声明一个public修饰的方法来进行访问
<?php
class person{
private $age;
function __construct($age){
$this->age=$age;
}
public function get_age(){
return $this->age;
}
}
$li=new person(32);
echo $li->get_age(); #使用get_age()方法访问私有变量
// 运行结果:
// 32
?>
使用魔术方法
- 魔术方法__set():为成员属性进行赋值
- 可以对赋值内容做一些限制
- 只用一个函数就可完成对所有私有成员属性的复制
<?php
class person{
private $age;
private $name;
public function get_age(){
return $this->age;
}
function __set($propertyName,$propertyValue){
$this->$propertyName=$propertyValue;
}
}
$li=new person();
$li->age=32; #在赋值时,系统会自动条用__set()方法
$li->name="li"; #看起来和直接赋值没有什么区别
echo $li->get_age();
?>
- 魔术方法:__get()
- 在获取私有变量的值时,会自动调用此方法
- 它有一个必选参数,也就是属性的名称,可以对提取内容做一些限制
<?php
class person{
private $age;
private $name;
public function get_age(){
return $this->age;
}
function __set($propertyName,$propertyValue){
$this->$propertyName=$propertyValue;
}
function __get($propertyName){
return $this->$propertyName;
}
}
$li=new person();
$li->age=32;
$li->name="li";
#获取数值
echo $li->name."<br/>"; #自动调用__get()方法
echo $li->age;
// 运行结果:
// li
// 32
?>
继承性
- 通过子类对已经存在的父类进行功能扩展
类继承的应用
<?php
class person{
private $age;
private $name;
public function get_age(){
return $this->age;
}
function __set($propertyName,$propertyValue){
$this->$propertyName=$propertyValue;
}
function __get($propertyName){
return $this->$propertyName;
}
}
class student extends person {
private $class_s;
public function read(){
echo "正在阅读";
}
function __set($propertyName,$propertyValue){ #设置私有变量
$this->$propertyName=$propertyValue;
}
function __get($propertyName){ #使用私有变量
return $this->$propertyName;
}
}
$li=new student();
$li->name="li";
$li->age=12;
$li->class_s="一班";
echo $li->name." ".$li->age." ".$li->class_s." ";
$li->read();
// 运行结果:
// li 12 一班 正在阅读
?>
访问继承控制
- 请查看上表
子类中重载父类的方法
- 在php中没有方法的重载,但是可以重载父类同名的方法
- 在php中提供了子类在重载方法中调用父类中被覆盖方法的功能,可以使用“parent::方法名”
<?php
class person{
protected $age;
protected $name;
function __construct($name,$age){
$this->name=$name;
$this->age=$age;
}
function __get($propertyName){
return $this->$propertyName;
}
}
class student extends person {
private $class_s;
function __construct($name,$age,$class_s){
parent::__construct($name,$age); #使用父类的重载方法
$this->class_s=$class_s; #新增子类的属性赋值
}
function __get($propertyName){ #使用私有变量
return $this->$propertyName;
}
}
$li=new student("li",12,"一");
echo $li->name;
#输出结果:li
?>
- 注意,看重载方法的时候,子类重载方法的访问权限要高于或者等于父类方法的访问权限
常见的关键字和魔术方法
final关键字
- 可以加在类或者类方法中,但是不能使用final标识成员属性
- 使用final的类,不能被继承
- 在类中使用final标识的方法,在子类中不能被覆盖
static关键字
- static关键字可以用来修成成员变量,也可以用来修饰成员方法
- static关键字创建的成员是这个类共有的,不属于任何一个被实例化的对象,有点类似于全局变量,因此,在访问static修饰的成员时,成员方法对其访问也不能使用$this关键字,而使用
self::成员名
的方式来进行访问 - static关键字修饰的成员,可以直接通过类名来访问,而不需要实例化对象;
类名::成员名
- 在静态方法中只能访问静态成员,因为非静态成员需要通过对象的引用才能访问,通常是使用$this来完成的,而静态方法在对象不存在的情况下也可以进行使用,因此不能在静态方法中访问非静态成员。
<?php
class person{
protected $age;
protected $name;
static $cap;
function __construct($name,$age){
$this->name=$name;
$this->age=$age;
}
function __get($propertyName){
return $this->$propertyName;
}
static function say(){
echo "你好";
}
}
person::$cap="student"; #访问静态成员
echo person::say()." ";
echo person::$cap; #使用静态方法
// 运行结果:
// 你好 student
?>
const关键字
- 用于在类中定义常量,定义完成之后不能修改
- 只能通过类名或者self关键字来进行访问,而不能通过对象来进行访问
- 定义常量成员时,不用使用$符号,并且一般都是大写的形式进行声明
<?php
class person{
const AGE=5;
static function get_AGE(){
return self::AGE;
}
}
echo person::AGE;
echo person::get_AGE();
// 运行结果:
// 55
?>
克隆对象
- 可以使用
clone
关键字来克隆对象,克隆出来的对象互不干扰 - 可以在类中声明一个
__clone
魔术方法,该方法不需要任何参数,并且克隆时自动调用
<?php
class person{
protected $age;
function __set($name,$value){
$this->$name=$value;
}
function __get($name){
return $this->$name;
}
function __clone(){
$this->age=55;
}
}
$li=new person();
$li->age=32;
echo $li->age."<br/>";
$wang=clone $li;
echo $wang->age;
// 运行结果:
// 32
// 55
?>
魔术方法:__toString()
- 在直接输出对象时会自动调用,该方法要返回一个字符串,一般都是对象的相关属性
<?php
class person{
protected $age;
function __set($name,$value){
$this->$name=$value;
}
function __get($name){
return $this->$name;
}
function __clone(){
$this->age=55;
}
#输出对象
function __toString(){
return "age:".$this->age;
}
}
$li=new person();
$li->age=32; #为成员变量赋值,这里自动调用__set()方法
echo $li; #自动调用__toString()方法
// 运行结果:
// age:32
?>
魔术方法:__call()
- 调用对象中不存在方法时,就会自动调用这个方法,给用户一些反馈信息
- 接收两个参数,第一参数是并不存在方法的方法名称,第二个参数是传递进来的参数数组
<?php
class person{
protected $age;
function __set($name,$value){
$this->$name=$value;
}
function __get($name){
return $this->$name;
}
function __call($name,$array){
echo "方法“".$name."”不存在"."<br/>";
echo "参数如下:"."<br/>";
foreach ($array as $key => $value) {
echo $key.":".$value."<br/>";
}
}
}
$li=new person();
$li->yes(1,2,3,"参数四");
// 运行结果:
// 方法“yes”不存在
// 参数如下:
// 0:1
// 1:2
// 2:3
// 3:参数四
?>
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容