php提供了三种访问控制符号.
有三种
1. public 表示全局,可以在本类,类外部,子类 中使用
2. protected 表示受到保护, 可以在本类, 子类中使用
3. private 表示私有, 只能在本类使用
这三个控制修饰符号可以对 属性 和 方法修饰
1. 如果一个方法没有访问修饰符,则默认是public
2. 属性 必须指定访问修饰符
☞ 方法之间可以互相调用. 但是需要使用 $this引用
function test11(){
$this->test12();
}
protected function test12(){
echo "test12 hello";
}
举例说明:
class Person{
public $name;
protected $age;
private $salary;
function __construct($name,$age,$salary){
$this->name=$name;
$this->age=$age;
$this->salary=$salary;
}
//成员方法
function showInfo(){
//这里说明在本类中可以使用 public protected 和private 修饰的变量.
echo $this->name."||".$this->age."||".$this->salary;
}
}
//创建一个人
$p1=new Person("孙悟空",30,1000);
echo $p1->name; //可以
echo $p1->age;//报错
echo $p1->salary;//报错.
?我们现在就想去访问protected 变量或者 private 变量, 通常的做法是提供 public 函数去访问 这些变量. 形式是
public function setXxx($val){
}
public function getXxx(){
}
public function showInfo(){
}
public protected private 可以修饰属性和方法
(1) 查看 薪水 (private )
//获取这个人的薪水
public function getSalary($user,$pass){
if($user=="shunping" && $pass="123"){
return $this->salary;
}else{
return "sorry,你无法看";
}
}
(2) 修改人的年龄
提供了两个函数.
//修改年龄,对输入的值,进行校验.
public function setAge($age){
if($age>1 && $age<120){
$this->age=$age;
}else {
echo "年龄范围不对";
}
}
//查看年龄
public function getAge(){
return $this->age;
}
还有一种形式, 通过 一对 __set 和 __get方法来操作我们的变量,不推荐.
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="hello";
echo $a1->n1;
$a1->n2=890;
echo "||".$a1->n2;
不推荐的理由:1给人的感觉:破坏了封装性2对所有属性都统一操作,无法对某些属性进行单独限制
可以直接写一个方法来操作private,protected变量
class Peron{
protected n1;
private $n2;
function showInfo($n1){
$this->n1=$n1;
echo $this->n1.”||”$this->n2;
}
}
-------------------------------------------------------------------------------------------------------------------------------------
继承:---php与java一样都是单重继承,可以通过a entends b,b extends c来实现多次继承(多重继承可能导致重名的方法)
继承可以提高代码的复用性
为什么需要继承
//应用场景 开发一套学生管理系统(Pupil, Graduate , ...)
//小学生类
class Pupil{
public $name;
protected $age;
protected $grade;
public function showInfo(){
echo $this->name."||".$this->age;
}
public function tesing(){
echo " 小学生考试..";
}
}
//研究生类
class Graduate{
public $name;
protected $age;
protected $grade;
public function showInfo(){
echo $this->name."||".$this->age;
}
public function tesing(){
echo "研究生考试..";
}
}
从上面的代码我们看出,代码的复用性不高,同时也会让管理代码成本增高.
è 解决之道(继承);
现在我们使用继承对上面的代码,进行改写.
代码:
//应用场景 开发一套学生管理系统(Pupil, Graduate , ...)
//父类
class Stu{
public $name;
protected $age;
protected $grade;
public function showInfo(){
echo $this->name;
}
}
//子类
class Pupil extends Stu{
public function testing(){
echo " 小学生考试..";
}
}
class Graduate extends Stu{
public function testing(){
echo "研究生考试..";
}
}
//创建学生
$stu1=new Pupil();
$stu1->name="小明";
$stu1->testing();
$stu1->showInfo();
//创建一个研究生
$stu2=new Graduate();
$stu2->name="老明";
$stu2->testing();
$stu2->showInfo();
☞ 从上面的代码我们可以看出:
所谓继承就是 一个子类 通过 extends 父类 把父类的 (public / protected)属性和(public / protected)方法继承下来.
继承的基本语法是:
class 类名 extends 父类名{
//在写自己需要的属性和方法.
}
1. 父类的 public 、protected 的属性和方法被继承. private 的属性和方法没有被继承.
2. 一个类只能继承一个父类,(直接继承).如果你希望继承多个类的属性和方法,则使用多层继承
class A{
public $n1=90;
}
class B extends A{
public $n2="hello";
}
class C extends B{
}
$c=new C();
echo $c->n1;
3. 当创建子类对象的时候,默认情况下,不会自动调用父类的构造方法.//注意与java区别
class A{
public $n1=90;
//构造方法
public function __construct(){
echo "A __construct";
}
}
class B extends A{
function __construct(){
echo "B __construct";
}
}
//创建B对象实例
$b=new B();
4. 如果我们希望去调用父类的 构造方法,或者其它的方法(public / protected) ,可以这样处理 (了解)
4.1 类名::方法名() 4.2 parent::方法名()
举例
class A{
public $n1=90;
//构造方法
public function __construct(){
echo "A __construct";
}
}
class B extends A{
function __construct(){
echo "B __construct";
//显式的调用父类的方法
//A::__construct();
parent::__construct();
}
}
//创建B对象实例
$b=new B();
5. 当一个子类的方法和父类的方法完全一样(public protected), 我们称为 方法的覆盖 (方法重写)
找错: