PHP中public,private,protected,abstract等关键字的相关用法

一.变量与方法的关键字public,private,protected

1、public的权限最大,既可以让子类使用,也可以支持实例化之后的调用,
2、protected表示的是受保护的,访问的权限是只有在子类和本类中才可以被访问到
3、private 表示的是私有,只能够是在当前的类中可以被访问到

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运行的结果如下:

function test(){
 $var=1;
 echo $var."";
 $var++;
}
test();// 1
test();// 1
test();// 1

如果我们给变量加上static那么就会变成这样

function test(){
 static $var=1;
 echo $var."";
 $var++;
}
test();// 1
test();// 2
test();// 3
三、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";
    }
}
报错:
Cannot override final method BaseClass::moreTesting()
四、特殊关键字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在实际的应用中有这样的几种场景
  3. 多人编程的时候规范公共部分的命名规则(不做任何说明,原理跟interface一样)
  4. 实现不让父级直接实例化使用
abstract class shopping

{
    public function buy()

    {
        echo "buy";

    }
    public abstract function loan();


}

class leslieBuy extends shopping

{
  public function loan()
  {
      // TODO: Implement loan() method.
      echo 123;
  }
}

//$test1=new shopping;//直接语法错误

$leslieSie = new leslieBuy;

$leslieSie->loan();//打印出loan
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容