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


Posted in PHP onDecember 31, 2017

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

示例代码:

<?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
?>

以上这篇详谈PHP中public,private,protected,abstract等关键字的用法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
dedecms模板标签代码官方参考
Mar 17 PHP
实用函数7
Nov 08 PHP
PHP中如何定义和使用常量
Feb 28 PHP
处理单名多值表单的详解
Jun 08 PHP
thinkphp常见路径用法分析
Dec 02 PHP
thinkPHP3.2简单实现文件上传的方法
May 16 PHP
支付宝服务窗API接口开发php版本
Jul 20 PHP
PHP获取input输入框中的值去数据库比较显示出来
Nov 16 PHP
phpStudy中升级MySQL版本到5.7.17的方法步骤
Aug 03 PHP
PHP实现微信商户支付企业付款到零钱功能
Sep 30 PHP
Yii框架自定义数据库操作组件示例
Nov 11 PHP
PHP扩展类型及安装方式解析
Apr 27 PHP
php中通用的excel导出方法实例
Dec 30 #PHP
利用Laravel生成Gravatar头像地址的优雅方法
Dec 30 #PHP
PHP如何实现订单的延时处理详解
Dec 30 #PHP
PHP 的Opcache加速的使用方法
Dec 29 #PHP
PHP自定义序列化接口Serializable用法分析
Dec 29 #PHP
PHP检测接口Traversable用法详解
Dec 29 #PHP
PHP聚合式迭代器接口IteratorAggregate用法分析
Dec 28 #PHP
You might like
php IP转换整形(ip2long)的详解
2013/06/06 PHP
解析php中session的实现原理以及大网站应用应注意的问题
2013/06/17 PHP
php基于mcrypt_encrypt和mcrypt_decrypt实现字符串加密解密的方法
2016/07/12 PHP
PHP getID3类的使用方法学习笔记【附getID3源码下载】
2019/10/18 PHP
通过jQuery源码学习javascript(一)
2012/12/27 Javascript
关闭浏览器时提示onbeforeunload事件
2013/12/25 Javascript
jquery实现当滑动到一定位置时固定效果
2014/06/17 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(jquery)
2014/11/16 Javascript
js精美的幻灯片画集特效代码分享
2015/08/29 Javascript
JavaScript调用传递变量参数的相关问题及解决办法
2015/11/01 Javascript
js实现不重复导入的方法
2016/03/02 Javascript
jQuery使用$.each遍历json数组的简单实现方法
2016/04/18 Javascript
详解JSON1:使用TSQL查询数据和更新JSON数据
2016/11/21 Javascript
JavaScript错误处理和堆栈追踪详解
2017/04/18 Javascript
关于Stream和Buffer的相互转换详解
2017/07/26 Javascript
在小程序中使用腾讯视频插件播放教程视频的方法
2018/07/10 Javascript
原生JavaScript实现滑动拖动验证的示例代码
2019/12/06 Javascript
vue项目实现设置根据路由高亮对应的菜单项操作
2020/08/06 Javascript
Python修改文件往指定行插入内容的实例
2019/01/30 Python
python整小时 整天时间戳获取算法示例
2019/02/20 Python
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
2019/09/17 Python
python3连接kafka模块pykafka生产者简单封装代码
2019/12/23 Python
win10安装tesserocr配置 Python使用tesserocr识别字母数字验证码
2020/01/16 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
2020/02/11 Python
sklearn的predict_proba使用说明
2020/06/28 Python
OpenCV读取与写入图片的实现
2020/10/13 Python
python list的index()和find()的实现
2020/11/16 Python
Can a struct inherit from another class? (结构体能继承类吗)
2014/07/22 面试题
水果连锁超市创业计划书
2014/01/24 职场文书
总经理岗位职责范本
2014/02/02 职场文书
小学毕业寄语大全
2014/04/03 职场文书
2014年毕业演讲稿范文
2014/05/13 职场文书
商场开业庆典策划方案
2014/06/02 职场文书
班级联欢会主持词
2015/07/03 职场文书
离职员工给领导和同事的感谢信
2015/11/03 职场文书
2016年劳模先进事迹材料
2016/02/25 职场文书