zl程序教程

您现在的位置是:首页 >  后端

当前栏目

php面向对象全攻略(九)访问类型

PHP 类型 访问 面向对象 全攻略
2023-06-13 09:14:13 时间
13.访问类型
类型的访问修饰符允许开发人员对类成员的访问进行限制,这是PHP5的新特性,但却
是OOP语言的一个好的特性。而且大多数OOP语言都已支持此特性。PHP5支持如下3种访
问修饰符
public(公有的、默认的),private(私有的)和protected(受保护的)三种。
public公有修饰符,类中的成员将没有访问限制,所有的外部成员都可以访问(读和写)
这个类成员(包括成员属性和成员方法),在PHP5之前的所有版本中,PHP中类的成员都是
public的,而且在PHP5中如果类的成员没有指定成员访问修饰符,将被视为public。
例:public$name;
publicfunctionsay(){};
private私有修改符,被定义为private的成员,对于同一个类里的所有成员是可见的,即
是没有访问限制;但对于该类的外部代码是不允许改变甚至读操作,对于该类的子类,也不
能访问private修饰的成员。
例:private$var1=‘A";//属性
privatefunctiongetValue(){}//函数
protected保护成员修饰符,被修饰为protected的成员不能被该类的外部代码访问。但是
对于该类的子类有访问权限,可以进行属性、方法的读及写操作,该子类的外部代码包括其的
子类都不具有访问其属性和方法的权限。
例:protected$name;
protectedfunctionsay(){};
privateprotectedpublic
同一个类中√√√
类的子类中√√
所有的外部成员√
代码片段
复制代码代码如下:

<?php
/**
*DefineMyClass
*/
classMyClass{
public$public="Public";
protected$protected="Protected";
private$private="Private";
functionprintHello(){
echo$this->public;
echo$this->protected;
echo$this->private;
}
}
$obj=newMyClass();
echo$obj->public;//Works
echo$obj->protected;//FatalError
echo$obj->private;//FatalError
$obj->printHello();//ShowsPublic,ProtectedandPrivate
/**
*DefineMyClass2
*/
classMyClass2extendsMyClass{
//Wecanredeclarethepublicandprotectedmethod,butnotprivate
protected$protected="Protected2";
functionprintHello(){
echo$this->public;
echo$this->protected;
echo$this->private;
}
}
$obj2=newMyClass2();
echo$obj->public;//Works
echo$obj2->private;//Undefined
echo$obj2->protected;//FatalError
$obj2->printHello();//ShowsPublic,Protected2,notPrivate
?>

代码片段
复制代码代码如下:

<?php
/**
*DefineMyClass
*/
classMyClass{
//Contructorsmustbepublic
publicfunction__construct(){}
//Declareapublicmethod
publicfunctionMyPublic(){}
//Declareaprotectedmethod
protectedfunctionMyProtected(){}
//Declareaprivatemethod
privatefunctionMyPrivate(){}
//Thisispublic
functionFoo(){
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate();
}
}
$myclass=newMyClass;
$myclass->MyPublic();//Works
$myclass->MyProtected();//FatalError
$myclass->MyPrivate();//FatalError
$myclass->Foo();//Public,ProtectedandPrivatework
/**
*DefineMyClass2
*/
classMyClass2extendsMyClass{
//Thisispublic
functionFoo2(){
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate();//FatalError
}
}
$myclass2=newMyClass2;
$myclass2->MyPublic();//Works
$myclass2->Foo2();//PublicandProtectedwork,notPrivate
?>

另外在子类覆盖父类的方法时也要注意一点,子类中方法的访问权限一定不能低于父类
被覆盖方法的访问权限,也就是一定要高于或等于父类方法的访问权限。
例如,如果父类方法的访问权限是protected那么子类中要覆盖的权限就要是protected
和public,如果父类的方法是public那么子类中要覆盖的方法只能也是public,总之子类中的
方法总是要高于或等于父类被覆盖方法的访问权限。