详谈PHP中public,private,protected,abstract等关键字的
⽤法
PHP中常⽤的关键字
在PHP中包含了很多对函数和类进⾏限制的关键字,常⽤的通常有abstract,final,interface,public,protected,private,static等等,下⾯我们就将对这些进⾏分析整理各个的⽤法。
变量与⽅法的关键字public,private,protected
public的权限最⼤,既可以让⼦类使⽤,也可以⽀持实例化之后的调⽤,
protected表⽰的是受保护的,访问的权限是只有在⼦类和本类中才可以被访问到
private 表⽰的是私有,只能够是在当前的类中可以被访问到
<?php
//
/**
* Define MyClass
*/
class MyClass
{
public $public = 'Public';
protected $protected = 'Protected';
private $private = 'Private';
public function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
protected function pro_test(){
var_dump(1);
}
}
$obj = new MyClass();
echo $obj->public; // 这⾏能被正常执⾏
//echo $obj->protected; // 这⾏会产⽣⼀个致命错误
//echo $obj->private; // 这⾏也会产⽣⼀个致命错误
$obj->printHello(); // 输出 Public、Protected 和 Private
$obj->pro_test();//直接报错
>
变量与⽅法的关键字static
static的作⽤就是能够实现值或者⽅法在类中不需实例化的情况下调⽤,同时static修饰的变量具有与值存储的功能,例如我们不使⽤static运⾏的结果如下:
<?php
function test(){
$var=1;
echo $var."</br>";
$var++;
}
test();// 1
test();// 1
test();// 1
>
如果我们给变量加上static那么就会变成这样
<?php
function test(){
static $var=1;
echo $var."</br>";
$var++;
}
test();// 1
test();// 2
test();// 3
这⾥可能不能够体会到PHP这样做的好处,那么我们就先来假设⼀下读者也熟悉JS,在JS中是没有static这个关键字的,所以如果我们要来实现⼀个具有能够保存每⼀次程序运算结果作为下⼀次运算的依据的⼀个程序我们需要这样来写。
var glo=0;
function test(){
glo++;
document.writeln(glo);
}
test();
test();
test();
这样就会把glo泄漏到全局变量中,如果⽣成的变量⽐较多,就会导致内存泄露(内存泄漏所指代的就是变量占⽤过多的内存空间没有别释放)
<script>
var glo=0;
function test(){
glo++;
document.writeln(glo);
}
test();// 1
test();// 2
test();// 3
</script>
所以相⽐于在没有定义static的语⾔中,它具有⼀个优势是保持变量,不泄露内存,也不容易导致全局变量被误⽤(因为作⽤域不在全局)
$age=0;
$age++;
function test1() {
static $age = 100;
$age++;
echo $age."</br>";
}
function test2() {
static $age = 1000;
$age++;
echo $age."</br>";
}
test1(); // 101
test2(); // 1001
class与⽅法的关键字final
final只能够⽤来修饰class与function,使⽤了final之后就不能够被继承,例如如下的代码就会直接报错
class BaseClass {
public $public = 'Public';
function test() {
echo "BaseClass::test() called\n";
}
final public function moreTesting() {
echo "BaseClass::moreTesting() called\n";
}
}
class ChildClass extends BaseClass {
public function moreTesting() {
echo "ChildClass::moreTesting() called\n";
}
}
特殊关键字interface,abstract
interface的意义在于规范编程的风格,设想⼀下就是如果是实现了⼀个接⼝那么我们在使⽤这个接⼝类的时候就必须要实现⾥⾯的⽅法,起到了统⼀命名的作⽤。
class是可以多继承接⼝的,接⼝与接⼝之间的单继承是通过extends来实现的,class与接⼝之间的关系确⽴是通过implements
⽰例代码:
interface testA{
function funcA();
}
interface testB{
function funcB();
}
interface testC extends testA {
function funcC();
}
class run implements testC ,testB {
public function funcA()
{
// TODO: Implement funcA() method.
}
public function funcB()
{
// TODO: Implement funcB() method.
}
public function funcC()
{
// TODO: Implement funcC() method.
}
}
>
abstract的作⽤跟interface其实是⼀样的,但是在interface中所有的⽅法都是必须要实现的,但是在abstract修饰的类中,可以有⼀个或者是多个的abstract修饰⽅法,所以我们可以这样理解,interface就是abstract的⼀种特殊情况(当所有的⽅法都是抽象⽅法,都是必须要实现的)。abstract有以下的这些特征:
1. 只要类中有⾄少⼀个⽅法使⽤了abstract关键字,那么这个类是abstract,要加上相应的关键字
2. 抽象⽅法,只有⽅法的声明部分,没有⽅法体。
但是在我看来,abstract在实际的应⽤中有这样的⼏种场景
1. 多⼈编程的时候规范公共部分的命名规则(不做任何说明,原理跟interface⼀样)
2. 实现不让⽗级直接实例化使⽤
样式代码如下:
<?php
abstract class shopping
{
public function buy()
{
echo "buy";
}
public function loan()
{
php实例化后获取子类名称echo "loan";
}
}
class leslieBuy extends shopping
{
}
//$test1=new shopping;//直接语法错误
$leslieSie = new leslieBuy;
$leslieSie->loan();//打印出loan
>
以上这篇详谈PHP中public,private,protected,abstract等关键字的⽤法就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论