php面向对象编程的封装性2016-10-15 本站 guaitu
封装的概念
封装就是把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作(成员方法),才能对数据进行操作。例:在人这个类中,人的年龄和工资是隐私的
<?php
class Person{
public $name;
private $age;
private $salary;
function __construct($name,$age,$salary){
$this->name=$name;
$this->age=$name;
$this->salary=$salary;
}
}
//创建一个人
$p1=new Person("张三",30,1000);
//访问张三的工资
//echo $p1->salary; //会报错,不能访问private中的属性
echo $p1->name;
?>
封装的访问修饰符
php提供三种访问控制修饰符号来控制方法和变量(属性)的访问权限public 表示全局,类的外部、内部和子类都可以访问。protected 表示受保护的,只有本类或子类可以访问;private 表示私有的,只有本类内部可以使用;
这三个修饰符号可以修饰变量和方法。
1) 如果一个方法没有访问修饰符,默认是public的。2)属性(变量)必须指定访问修饰符。3)方法之间可以相互调用,但需要$->this引用。如下表:
| | public | protected | private |
| 全局 | √ | X | X |
| 继承类 | √ | √ | X |
| 本类 | √ | √ | √ |
例:
<?php
class Person{
public $name;
protected $age;
private $salary;
function __construct($name,$age,$salary){
$this->name=$name;
$this->age=$name;
$this->salary=$salary;
}
function showInfo(){
//在本类中可以使用public,protected和private类型的值
echo $this->name."||".$this->age."||".$this->salary."<br />";
}
}
//创建一个人
$p1=new Person("张三",30,1000);
//访问张三的工资
//echo $p1->salary; //会报错,不能访问private中的属性
echo $p1->name."<br />";
$p1->showInfo();
//echo $p1->age;//报错,因为$age是protected的,类外不能访问
//echo $p1->salary; //报错,因为$salary是private的,类外不能访问
?>
如何访问protected和private修饰的成员变量?通常是在类中通过public的函数去访问这些变量。也可以使用php提供的方法
__set();和__get();这两种方法也被称为魔术方法。
注意:目前已经不推荐使用魔术方法了。__set()对protected或private属性进行赋值操作,例:__set($name,$value);__get()获取protected或private属性的值,例:__get($name);例:
<?php
class A{
private $n1;
private $n2;
private $n3;
//使用__set方法来管理所有私有属性
public function __set($pro_name,$pro_val){
$this->pro_name=$pro_val;
}
//使用__get方法来管理所有私有属性的值
public function __get($pro_name){
if(isset($pro_name)){
return $this->pro_name;
}else{
return null;
}
}
}
$a1=new A();
$a1->n1="www.bianceng.cn";
echo $a1->n1; //输出www.bianceng.cn
?>
通常是在类中通过public的函数去访问protected和private修饰的成员变量
例:
<?php
class Person{
public $name;
protected $age;
private $salary;
function __construct($name,$age,$salary){
$this->name=$name;
$this->age=$name;
$this->salary=$salary;
}
function showInfo(){
//在本类中可以使用public,protected和private类型的值
echo $this->name."||".$this->age."||".$this->salary."<br />";
}
//我们可以通过public的函数来访问protected或private的变量
function getSalary($user,$pass){
if($user=="www.bianceng.cn" && $pass==123){
return $this->salary;
}else{
echo "你没有查看工资的权限";
}
}
}
//创建一个人
$p1=new Person("张三",30,1000);
//访问张三的工资
//echo $p1->salary; //会报错,不能访问private中的属性
echo $p1->name."<br />";
$p1->showInfo();
//echo $p1->age;//报错,因为$age是protected的,类外不能访问
//echo $p1->salary; //报错,因为$salary是private的,类外不能访问
echo $p1->getSalary("www.bianceng.cn",123);
?>
例:修改和查看上例中被protected的age
<?php
class Person{
public $name;
protected $age;
private $salary;
function __construct($name,$age,$salary){
$this->name=$name;
$this->age=$name;
$this->salary=$salary;
}
function showInfo(){
//在本类中可以使用public,protected和private类型的值
echo $this->name."||".$this->age."||".$this->salary."<br />";
}
//我们可以通过public的方法来访问protected或private的变量
function getSalary($user,$pass){
if($user=="www.bianceng.cn" && $pass==123){
return $this->salary;
}else{
echo "你没有查看工资的权限";
}
}
//修改年龄
public function setAge($age){
if($age>=1 && $age<=120){
$this->age=$age;
}else{
echo "<br />年龄范围不对!<br />";
}
}
//查看年龄
public function getAge(){
return $this->age;
}
}
//创建一个人
$p1=new Person("张三",30,1000);
//访问张三的工资
//echo $p1->salary; //会报错,不能访问private中的属性
echo $p1->name."<br />";
$p1->showInfo();
//echo $p1->age;//报错,因为$age是protected的,类外不能访问
//echo $p1->salary; //报错,因为$salary是private的,类外不能访问
echo $p1->getSalary("www.bianceng.cn",1203);
//修改年龄
$p1->setAge(75);
echo "<br />".$p1->getAge();
?>
URL:http://www.bianceng.cn/webkf/PHP/201610/50461.htm