PHP变量命名规则详解
PHP变量命名规则
1、变量以美元符号$开头。如$name,$age。
2、美元符号$后面的第一个字符不可以是数字,只能是下划线_或者字母。如$1_1这样的变量是错误的。
3、除了下划线_外,变量不允许出现任何空格或标点符号。也就是说变量名只能包含:a-z、A-Z、0-9 以及下划线_。
4、PHP变量名是区分大小写的。如$name与$Name是两个不同的变量。
PHP变量命名规则其余注意事项
1、当用两个或两个以上的单词命名变量时,可以将除第一个单词以外的所有单词的首字母大写。如$myName、$yourFamilyName。
2、以下划线_开始命名的变量通常代表特殊的变量。如在类中创建受保护的属性、PHP预定义变量($_GET)、全局数组等。
3、定义变量的时候,不要贪图简短,而应该使用具有描述性的名称定义变量。
学而不思则罔,思而不学则殆。希望您在学习PHP的道路上一帆风顺,并成为PHP编程艺术大师。
以上便是PHP变量命名规则的全部内容。以下是废话,如果您有时间,不妨粗略阅读,也许您能产生共鸣。
PHP变量命名规则
从大学开始到现在,陆陆续续接触过各种编程语言。如客户端语言Javascript,Actionscript;服务器端语言C++,Java,ASP.net,PHP等等,不一而足。在所有这些语言中,我最想学的是PHP。不为别的,就因为PHP的读法:屁H屁,说起来琅琅上口,韵味十足。今天看到PHP变量命名规则这一节,索性就随便写一点东西,聊以打发无聊的光阴。
对PHP的学习,一直时断时续。年轻时候要学好PHP的雄心壮志如今差不多荡然无存了。
有人说,活在这样一个社会里,没有人能一尘不染地活着。这是个怎样的社会?我不太清楚。不过我听人说,这是个聋子听见哑巴说瞎子看见了爱情的扯淡时代。不完全信,但也无法完全不信。
不管怎样,既然活着是不容易的,那么就且活且珍惜吧。
PHP是我想珍惜的。
于是,今天翻了一翻从图书馆借来的新书——PHP动态网页设计(第二版,作者David Powers)。
看到PHP变量命名规则一节。这些非常基础的内容,在时隔数年之后重新温习,倒是真有温故而知新的感觉。
为了使印象更为深刻,也为了实践,好记性不如烂笔头的真理,在这不太安分的夜里,我决定写这篇文章,献给曾经想成为PHP高手的自己。
1、变量以美元符号$开头。如$name,$age;
2、美元符号$后面的第一个字符不可以是数字;
3、除了下划线_外,变量不允许出现任何空格或者标点符号;
4、PHP变量名是区分大小写的。如$name与$Name是两个不同的变量。
其余注意事项
1、当用两个或两个以上的单词命名变量时,可以将除第一个单词以外的所有单词的首字母大写。如$myName;$yourFamilyName;
2、以下划线_开始命名的变量通常留给特殊的情况使用。如在类中创建受保护的属性;PHP预定义变量:全局数组等;
3、定义变量的时候,不要贪图简短,而应该使用具有描述性的名称定义变量。
例子
面是分别用骆驼式命名法和下划线法命名的同一个函数:
printEmployeePaychecks();
print_employee_paychecks();
第一个函数名使用了骆驼式命名法——函数名中的每一个逻辑断点都有一个大写字母来标记;第二个函数名使用了下划线法----函数名中的每一个逻辑断点都有一个下划线来标记。
骆驼式命名法近年来越来越流行了,在许多新的函数库和Microsoft Windows这样的环境中,它使用得相当多。另一方面,下划线法是c出现后开始流行起来的,在许多旧的程序和UNIX这样的环境中,它的使用非常普遍。
编辑本段应用概述
骆驼式命名法(Camel-Case)是电脑程式编写时的一套命名规则(惯例)。
骆驼式命名法就是当变量名或函式名是由一个或多个单字连结在一起,而构成的唯一识别字时,第一个单词以小写字母开始;第二个单词的首字母大写或每一个单词的首字母都采用大写字母,例如:myFirstName、myLastName,这样的变量名看上去就像骆驼峰一样此起彼伏,故得名。
骆驼式命名法(Camel-Case)一词来自 Perl 语言中普遍使用的大小写混合格式,而 Larry Wall 等人所著的畅销书《Programming Perl》(O'Reilly 出版)的封面图片正是一匹骆驼。
骆驼式命名法的命名规则可视为一种惯例,并无绝对与强制,为的是增加识别和可读性。
驼峰法(小驼峰法)
变量一般用小驼峰法标识。驼峰法的意思是:除第一个单词之外,其他单词首字母大写。譬如
int myStudentCount;
变量myStudentCount第一个单词是全部小写,后面的单词首字母大写。
Pascal法(大驼峰法)
相比小驼峰法,大驼峰法把第一个单词的首字母也大写了。常用于类名,函数名,属性,命名空间。譬如
publicclass DataBaseUser;
堆排序
堆排序是利用堆的性质进行的一种选择排序。下面先讨论一下堆。
1.堆
堆实际上是一棵完全二叉树,其任何一非叶节点满足性质:
Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>=Key[2i+1]&&key>=key[2i+2]
即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。
堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>=key[2i+2]称为大顶堆,满足 Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]称为小顶堆。由上述性质可知大顶堆的堆顶的关键字肯定是所有关键字中最大的,小顶堆的堆顶的关键字是所有关键字中最小的。
2.堆排序的思想
利用大顶堆(小顶堆)堆顶记录的是最大关键字(最小关键字)这一特性,使得每次从无序中选择最大记录(最小记录)变得简单。
其基本思想为(大顶堆):
1)将初始待排序关键字序列(R1,R2....Rn)构建成大顶堆,此堆为初始的无须区;
2)将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,......Rn-1)和新的有序区(Rn),且满足R[1,2...n-1]<=R[n];
3)由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,......Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2....Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。
操作过程如下:
1)初始化堆:将R[1..n]构造为堆;
2)将当前无序区的堆顶元素R[1]同该区间的最后一个记录交换,然后将新的无序区调整为新的堆。
因此对于堆排序,最重要的两个操作就是构造初始堆和调整堆,其实构造初始堆事实上也是调整堆的过程,只不过构造初始堆是对所有的非叶节点都进行调整。
堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法。学习堆排序前,先讲解下什么是数据结构中的二叉堆。
PHP 堆管理代码如下:
代码如下 | 复制代码 |
<?php $arr = [10,40,30]; heep::add($arr,40); echo join(',',$arr),'<br>'; heep::del($arr); heep::sort($arr); $arr = [40,10,30]; |
假设n为当前数组的key则,n的父节点为 n>>1 或者 n/2(整除);n的左子节点l= n<<1 或 l=n*2,n的右子节点r=(n<<1)+1 或 r=l+1
代码如下 | 复制代码 |
$arr=array(1,8,7,2,3,4,6,5,9); //整理成大顶堆,最大的数整到堆顶,并将最大数和堆尾交换,并在之后的计算中忽略数组后端的最大数(last),直到堆顶(last=堆顶) //整理当前树节点($n),临界点$last之后为已排序好的元素 //如果右孩子比左孩子大,则让父节点的右孩子比 //交换两个值 |
这里分析了php面向对象中static静态属性和静态方法的调用。关于它们的调用(能不能调用,怎么样调用),需要弄明白了他们在内存中存放位置,这样就非常容易理解了。静态属性、方法(包括静态与非静态)在内存中,只有一个位置(而非静态属性,有多少实例化对象,就有多少个属性)。
实例:
代码如下 | 复制代码 |
<?php |
静态属性
静态属性也就是说它的值保持其值,比如在类中实例化了N个对象,那么你可以在构造函数中定义一个静态属性来记住对象的个数。类中的静态属性和静态变量差不多,只不过在类中似乎又多了一个些使用上的限制罢了。让我们看看一般的变量吧:
代码如下 | 复制代码 |
1.<?php |
很显然这个函数的结果如下:
The number is:1
The number is:1
The number is:1
The number is:1
The number is:1
The number is:1
但是如果你的程序是这样:
代码如下 | 复制代码 |
1.<?php 2.function test() { 3. static $n = 1; 4. echo "The number is:$n<br />"; 5. $n++; 6.} 7.test(); 8.test(); 9.test(); 10.test(); 11.test(); 12.test(); 13.?> |
我们只不过在变量名加了个static关键字而已,结果就大大的不同了:
The number is:1
The number is:2
The number is:3
The number is:4
The number is:5
The number is:6
1.static关键字可以用来修饰变量、方法(静态方法)
2.不经过实例化,就可以直接访问类中static的属性和static的方法。
3.static 的属性和方法,只能访问static的属性和方法,不能访问非静态的属性和方法。因为静态属性和方法被创建时,可能还没有任何这个类的实例可以被调用。
4.在当前类中如果要访问静态成员可以使用self::关键字进行访问。
5.在类中我们不能使用this关键来访问静态属性,因为静态属性在对象可能还没有实例化之前已经存在。
6.在类中静态方法访问静态属性,使用类名::静态属性名即可调用类中的静态属性。
静态方法
代码如下 | 复制代码 |
1.<?php 2.class test { 3. private static $money = 2000; 4. public static function getonemon() { 5. return test :: $money; 6. } 7. public static function gettwomon() { 8. self :: $money = self :: $money -1500; 9. return self :: $money; 10. } 11.} 12.echo "我现在余额为:"; 13.echo test :: getonemon(); 14.echo "<br>"; 15.echo "消费后,我的余额为:"; 16.echo test :: gettwomon(); 17.?> |
在这个示例里我们看到,使用了两种方法来访问静态属性$money的值:一种是前面都提到的类名::属性值的形式,另外一种则是使用了self关键字。当然推荐使用self关键字这种方式,因为如果那天不高兴了,我们修改的类名,那么如果你使用了第一种方式,你是不是还得修改下调用它的方法呢,当然你得在同一个类中,如果你是在子类中想调用父类的静态属性和方法,那就得使用parent::的方式了。
再说一下
1:如果你想在静态方法中调用其它静态方法时,请使用方法是:类名::方法名的形式进行调用,还是那句,如果你在同一个类进行这样的调用,就使用selft关键字进行调用吧。要不然你得的程序可就得报错了。
2:php中静态方法不能调用非静态的属性和非静态方法,也不能使用类名::或者self::调用非静态属性。更不能使用$this->属性名来调用,总之在静态方法中只能调用静态属性或方法,非静态的无法调用。
结论:
(1)、静态属性不需要实例化即可调用。因为静态属性存放的位置是在类里,调用方法为"类名::属性名";
(2)、静态方法不需要实例化即可调用。同上
(3)、静态方法不能调用非静态属性。因为非静态属性需要实例化后,存放在对象里;
(4)、静态方法可以调用非静态方法,使用 self 关键词。php里,一个方法被self:: 后,它就自动转变为静态方法;(会提示strict)
我们有时需要记录用户或者后端的某个操作事件的运行情况,可以使用后端语言如PHP将操作结果记录到日志文件中,方便测试和查找问题。尤其是这些在后端运行的而前端不能直接看到运行结果的,那么就可以用日志文件记录下来,如果你经常跟一些接口开发如支付宝接口、微信卡券接口打交道的话,日志记录就必不可少了。
我们讲的PHP记录日志,就是将日志信息写入到一个日志文件中,区别于内存日志。写入日志的流程是:打开日志文件(如果不存在则新创建),然后将日志内容追加到日志文件的后面,最后关闭日志文件。
本文中,我们将日志内容以json个格式保存,方便必要时直接读取。
PHP写日志文件
PHP写日志文件需要打开、写入和关闭文件等操作,PHP有fopen(),fwrite()和fclose()三个函数与之对应,而另一个函数file_put_contents()它也能字符串写入文件,其实这个函数实现了依次调用 fopen(),fwrite() 以及 fclose()。所以我们使用file_put_contents()非常简洁。值得注意的是,往文件后面追加内容时需要带上参数:FILE_APPEND。
实际运行中,我们有可能会遇到日志文件超大的情况,所以我们设置一个最大值,当日志文件大小超过这个最大值时,将此日志文件备份好,然后重新生成一个新的日志文件来记录新的日志内容。
在写日志前,我们将日志内容进行json格式化,所以需要将内容转化成JSON格式,然后写入文件。当然你也可以不用json,或者换作别的工具程序(如日志分析工具)可以阅读的格式。总之,我们写入的内容是方便必要时可以方便读取。
function writeLog($filename,$msg){
$res = array();
$res['msg'] = $msg;
$res['logtime'] = date("Y-m-d H:i:s",time());
//如果日志文件超过了指定大小则备份日志文件
if(file_exists($filename) && (abs(filesize($filename)) > 1024000)){
$newfilename = dirname($filename).'/'.time().'-'.basename($filename);
rename($filename, $newfilename);
}
//如果是新建的日志文件,去掉内容中的第一个字符逗号
if(file_exists($filename) && abs(filesize($filename))>0){
$content = ",".json_encode($res);
}else{
$content = json_encode($res);
}
//往日志文件内容后面追加日志内容
file_put_contents($filename, $content, FILE_APPEND);
}
PHP读日志文件
必要时,我们会读取日志内容进行分析,同样我们使用PHP的file_get_contents()函数,直接将内容读取,并且转换成json格式,方便调用。
function readLog($filename){
if(file_exists($filename)){
$content = file_get_contents($filename);
$json = json_decode('['.$content.']',true);
}else{
$json = '{"msg":"The file does not exist."}';
}
return $json;
}
日志写入和读取类
写入和读取日志的功能我们经常要用到,所以我将写入和读取功能整理成类,方便调用。
<?php
/*
* 日志类
* 每天生成一个日志文件,当文件超过指定大小则备份日志文件并重新生成新的日志文件
*/
class Log {
private $maxsize = 1024000; //最大文件大小1M
//写入日志
public function writeLog($filename,$msg){
$res = array();
$res['msg'] = $msg;
$res['logtime'] = date("Y-m-d H:i:s",time());
//如果日志文件超过了指定大小则备份日志文件
if(file_exists($filename) && (abs(filesize($filename)) > $this->maxsize)){
$newfilename = dirname($filename).'/'.time().'-'.basename($filename);
rename($filename, $newfilename);
}
//如果是新建的日志文件,去掉内容中的第一个字符逗号
if(file_exists($filename) && abs(filesize($filename))>0){
$content = ",".json_encode($res);
}else{
$content = json_encode($res);
}
//往日志文件内容后面追加日志内容
file_put_contents($filename, $content, FILE_APPEND);
}
//读取日志
public function readLog($filename){
if(file_exists($filename)){
$content = file_get_contents($filename);
$json = json_decode('['.$content.']',true);
}else{
$json = '{"msg":"The file does not exist."}';
}
return $json;
}
}
?>
使用方法:
$filename = "logs/log_".date("Ymd",time()).".txt";
$msg = '写入了日志';
$Log = new Log(); //实例化
$Log->writeLog($filename,$msg); //写入日志
$loglist = $Log->readLog($filename); //读取日志
相关文章
- 下面本文章来给大家介绍在php中成员变量的一些对比了,文章举了四个例子在这例子中分别对不同成员变量进行测试与获取操作,下面一起来看看。 有如下4个代码示例,你认...2016-11-25
- 本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
- 这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
- 这篇文章主要介绍了R语言删除指定变量或对象的操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
- PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02
解决vue的router组件component在import时不能使用变量问题
这篇文章主要介绍了解决vue的router组件component在import时不能使用变量问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-27- index.php怎么打开?初学者可能不知道如何打开index.php,不会的同学可以参考一下本篇教程 打开编辑:右键->打开方式->经文本方式打开打开运行:首先你要有个支持运行PH...2017-07-06
- 这篇文章主要介绍了Vue select 绑定动态变量的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-23
- 在PHP中,大部分变量类型,如字符串,整型,浮点,数组等都是值类型的,而类和对象是引用类型,在使用的时候,需要注意这一点。看到网友在讨论PHP的&符号,要彻底理解它的用法,就有必要讨论一下变量的两种形式。PHP的变量在内存中是这样...2015-10-23
PHP中func_get_args(),func_get_arg(),func_num_args()的区别
复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04- 这篇文章主要介绍了PHP编程 SSO详细介绍及简单实例的相关资料,这里介绍了三种模式跨子域单点登陆、完全跨单点域登陆、站群共享身份认证,需要的朋友可以参考下...2017-01-25
- 下面小编就为大家带来一篇java中String类型变量的赋值问题介绍。小编觉得挺不错的。现在分享给大家,给大家一个参考。...2016-03-28
PHP YII框架开发小技巧之模型(models)中rules自定义验证规则
YII的models中的rules部分是一些表单的验证规则,对于表单验证十分有用,在相应的视图(views)里面添加了表单,在表单被提交之前程序都会自动先来这里面的规则里验证,只有通过对其有效的限制规则后才能被提交,可以很有效地保证...2015-11-24- 这篇文章主要介绍了详解ES6实现类的私有变量的几种写法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-10
- 虽然C#编译器为每个类型都设置了默认类型,但作为面向对象的设计原则,我们还是需要对变量进行正确的初始化。实际上这也是C#推荐的做法...2020-06-25
- 这篇文章主要介绍了PHP实现创建以太坊钱包转账等功能,对以太坊感兴趣的同学,可以参考下...2021-04-20
- 这篇文章主要介绍了python 实现循环定义、赋值多个变量的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
- 这篇文章主要给大家介绍了关于如何在JS中如何使用css变量以及export之javascript关键字的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2021-09-02
- 这篇文章主要为大家详细介绍了php微信公众账号开发之五个坑,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-10-02
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
首先是数据库的设计。分类表叫cate.我做的是分类数据的二级联动,数据需要的字段有:id,name(中文名),pid(父id). 父id的设置: 若数据没有上一级,则父id为0,若有上级,则父id为上一级的id。数据库有内容后,就可以开始写代码,进...2014-05-31