在PHP中包含了不少对函数和类进行限制的关键字,经常使用的一般有abstract,final,interface,public,protected,private,static等等,下面咱们就将对这些进行分析整理各个的用法。php
public的权限最大,既可让子类使用,也能够支持实例化以后的调用,编程
protected表示的是受保护的,访问的权限是只有在子类和本类中才能够被访问到函数
private 表示的是私有,只可以是在当前的类中能够被访问到this
<?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运行的结果以下:spa
<?php function test(){ $var=1; echo $var."</br>"; $var++; } test();// 1 test();// 1 test();// 1 ?>
若是咱们给变量加上static那么就会变成这样code
<?php function test(){ static $var=1; echo $var."</br>"; $var++; } test();// 1 test();// 2 test();// 3 ?>
这里可能不可以体会到PHP这样作的好处,那么咱们就先来假设一下读者也熟悉JS,在JS中是没有static这个关键字的,因此若是咱们要来实现一个具备可以保存每一次程序运算结果做为下一次运算的依据的一个程序咱们须要这样来写。blog
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
final只可以用来修饰class与function,使用了final以后就不可以被继承,例如以下的代码就会直接报错ip
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的意义在于规范编程的风格,设想一下就是若是是实现了一个接口那么咱们在使用这个接口类的时候就必需要实现里面的方法,起到了统一命名的做用。
class是能够多继承接口的,接口与接口之间的单继承是经过extends来实现的,class与接口之间的关系确立是经过implements
示例代码:
<?php 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() { echo "loan"; } } class leslieBuy extends shopping { } //$test1=new shopping;//直接语法错误 $leslieSie = new leslieBuy; $leslieSie->loan();//打印出loan ?>