Silentdoer

导航

统计

PHP语法零碎总结

一、这三个多月因为工作需要以及空闲时间比较多等原因,把Rust,Angular,Python,Go都学了一遍,并都做了一些项目进行了实践加强,其中个人比较喜欢Rust,不过Rust工作岗位少且进展比较慢,Angular是公司目前要用的前端框架,Python则自己用来代替shell,还能写一些自动化测试的脚本,Go则对Rust取其次,在国内比较流行,也相对简单,能直接生成可执行文件,可以代替java写一些web应用;

既然这些流行的语言都学了一遍,干脆就把PHP这个目前也还在流行中的语言也学一遍,学个大概能写项目即可,等以后万一需要复习起来也能比较快;

二、零碎总结:

1.PHP和Python声明变量的方式差不多,也是不需要加var之类的(和数据库里的也很像),不过要求以$开头;【好吧,其实和js某些方面更像,比如允许不初始化的变量声明,和使用不存在的变量】【和nginx配置里声明变量方式也挺像的,需要$开头】

2.PHP代码的标记风格有多种,不过这里自己统一用<?php ?>这种,比较流行和兼容,其他的知道即可;

3.PHP里同一个文件里所有的<?php ?>同属一个context;

4.PHP里打印用echo,和其他编程语言不太一样,而且它也不是一个函数(但是类似函数,也需要参数,只不过参数变成了option)【好吧,也有print_r($param);可以打印】

5.PHP里有三种注释//和#和/**/(感觉只需要其中两种即可)

6.PHP里的if语句和for语句,switch语句,while,do while,异常处理和java一样的用法;

7.PHP里字符串拼接是用.号,这个和其他语言很不一样。

8.PHP里变量区分大小写,除了是以$开头外其命名规范和java一样,也是数字字母下划线且数字不能开头,而$this是特殊的变量;

9.PHP里也是用小驼峰命名变量,但是字段是下划线,方法用小驼峰命名,但是函数则是下划线分隔,类则是大驼峰,名称空间也是大驼峰(好吧,小驼峰的也有。。)【文件名貌似没有一致的标准,下划线,横线,大驼峰的都有,根据具体情况来写吧】;

10.PHP代码也是以分号结束

11.PHP导入另一个PHP文件用require,而使用命名空间则是用use(这个和rust挺像的)

12.PHP里也有借用的说法(不过没有所有权),也是用&来获取某个变量的引用,将其赋值给另一个变量,则修改另一个变量原变量的值也会改变,如$b = &$a,修改$b,$a也跟着修改;

13.PHP有很多系统变量,如$GLOBALS,$_POST,$argv等等,不过都比较特殊的命名,还是比较容易区分(常量是没有$开头的);

14.PHP常量和变量的命名方式又很不同,常量没有$开头,然后也存在很多系统常量,不过它们都是以__开头和结尾(除了一些如PHP_VERSION这样的),且常量是全局的,可以像$GLOBALS一样使用;

注意,是常量而非只读变量,可以用define('PI', 3.14159);这种方式定义(注意是'PI'而非PI),也可以用const PI = 3.14159;这种方式定义。

常量也可以是数组(PHP7里的),常量如果重复定义会报错,不过不影响程序继续执行(会echo 错误信息),可以用defined('PI')来判断是否已经定义了常量PI;

15.PHP里数组和Map合二为一,用array(..)函数创建一个数组/Map;比如$arr = array('key' => 'value', 'key2' => 3);这种可以看成是map,还能$arr['key3']='skfjl'这样添加;

而$arr = array('value1', 'value2')这种是list的写法;还可以创建一个空数组$arr = array();然后$arr[] = 'php',则$arr[0]等于'php'

16.双引号和单引号的字符串区别在于双引号的会对变量进行解析,这个和shell是一样的,不过如果变量是数组,则还需要用{}把数组变量括起来;如果双引号的$a就是输出$a而不是其变量值则要\$a转义

17.PHP里null不区分大小写,所以null和NULL和Null是等价的(不过最好就写null),变量未赋值或未定义【即都没出现过】(js里是undefined)和被赋值为null以及被unset(..)函数【类似del】处理过的变量值都是null【由此可见js里的undefined的概念其实可以认为是多余的,而Python里不允许msg这样不初始化的变量存在,否则抛异常,必须是msg = None这样初始化一下,Python使用不存在的变量也是抛异常】null变量如果要打印要用var_dump($sss)不要用echo,echo打印null值什么也不显示,而var_dump($sss)则会输出NULL;

18.要判断一个变量是否已经声明且不为null可以用isset($sss)来判断

19.可以用gettype($arr)来获取变量的数据类型,如果$arr此刻是数组则输出array;PHP里有boolean,string,integer(也可以写成int),float,array,object,resource,null八种类型;

20.xxx.php文件里echo等打印出的html标签就会被客户端渲染(废话,xxx.php最终会被解析为静态的html数据,自然里面有什么标签就会渲染什么了)【所以PHP和java的freemarker模板其实区别不是很大,最大的不同是PHP是nginx将php文件给PHP处理器处理返回,而freemarker则是一个url由nginx转发给java服务,java服务发现请求了模板,然后由freemarker引擎渲染后由java服务返回给nginx然后返回给客户端,但是freemarker其实也是完全可以独立出来做成一个PHP一样的东西,写个cgi适配下就行,不过效率应该没PHP高,毕竟PHP是C/C++写的渲染引擎】

21.PHP还提供了is_array(..),is_string(..),is_int(..),is_double(..)等方法(上面还有个isset(..))来检测对象是否是某种类型;

22.PHP的强制类型转换和java一样,(int)'33'将字符串33转换为数值33(而且它还能(int)'33ssf'转换为33忽略后面的字符),还可以使用intval(..),floatval(..),strval(..)来转换,intval(..)表示把参数转换为int值;

23.PHP里两个字符串如果用+号则会先将它们转换为数值类型后再执行数学+号操作,这点和其他语言也很不同,.号是字符串拼接;

24.PHP里也有===恒等比较,即比较类型和数值都相等;(这一点和js是一致的),还有!==非恒等,即数值或类型存在一个不相同就不相同,即1 != '1'是false,而1 !== '1'是true;

25.PHP里也有++$i和$i++(--也有)

26.PHP也有三元运算符,即flag?a:b,flag是true执行a表达式,否则执行b表达式;注意,flag还可以是空字符串,null,0等值都认为是false;

27.PHP定义函数和js很像,也是function method_name($param1, $param2) {...},PHP的函数参数可以有默认值,即function test($param1, $param2 = 8) {..},传参时可以不传第二个参数(es6以前参数没有默认值,但是也可以不传全部实参,没有的其值为undefined,而且js没有重载的说法,所以不用担心出现不知道该调用哪个的问题)

28.PHP的包含文件可以用require或include,require如果文件不存在则会出错且不执行后面的语句,include则warning后继续执行;对应的还有require_once和include_once防止一个页面里多次包含同一个文件;

29.PHP里变量作用域主要是局部作用域,即函数内定义的变量;函数参数作用域(其实就类似局部作用域);全局作用域,即非函数里定义的变量,它可以被其他文件包含后引用(和es5一样),static作用域(就是函数内部的局部变量加了static关键字在前面,则函数结束后此变量不会销毁);注意这里比较坑的是函数用全局的变量居然不能直接用要global $quanJu;然后才能用;

30.字符串长度用strlen($str),还有strstr($content, $pattern, $before)最后的before表示是返回第一次找到的字符串前面的字符串还是后面的;(还有很多字符串操作函数,需要的时候再看)

31.PHP里else if有两种写法,一种是else if一种是elseif都可以;

32.PHP里可以通过foreach($arr as $value {echo $value}的方式实现对数组的值遍历;

33.PHP里对UTF-8的字符串截取不能用substr,而要用mb_substr(PHP5需要配置,PHP7不需要直接用),比如echo mb_substr('分身减口', 0, 2, 'UTF-8');输出分身

34.数组长度用count($arr)

35.PHP里的常用系统API比较蛋疼,它不像java或Python之类的一样是属于某个包或模块,有分类的概念,所以像c语言一样需要记很多函数的大致名字才能找到相关功能。。(特别是字符串操作,数组操作的相关API都是全局函数。)

像其他语言基本上记住模块或包名就能通过package.来弹出所有的函数或方法,然后看名字就大概知道干嘛用的。

36.PHP里的类和java有点像,总体而言是这样写的:

class Job {
    private $field1 = 88;
    // 静态变量外部调用是通过Job::$number来调用
    public static $number = 0;

  // 注意,JS里的方法是不能有function关键字的。
public function find_job($param1) { // 非静态方法可以用$this指针,且外部是通过$job -> find_job(..)来调用,注意这里是$this->field1而不是$this->$field1 echo 'sfsdf'.$this->field1; } // 外部调用也是用Job::test() public static function test() { echo 'sfjkl'; } }

PHP里的类也有private,protected,public(默认就是public)三种访问权限,而且也有构造方法用function __construct(..)定义,析构函数用function __destruct()定义;

37.PHP里继承用extends关键字指定,还有抽象类用abstract声明,接口用interface声明;(和java很像)

38.除了$this还有个self,self代表本类,其实它们就对应rust的self->$this,Self->self;

39.PHP可以在函数前面加@来忽略此函数的异常输出而继续执行后面的代码;

40.PHP的包依赖管理工具可以用composer

41.PHP也支持将xx.php作为脚本文件,然后用php xx.php执行,不过PHP没有REPL(输入php没进入),而且如果xx.php里面有html则会以普通字符串打印在控制台上。

42.PHP的lambda表达式就是匿名函数,'sf' => 'sfjlk'这种不是lambda,而是数组初始化的一种方式,匿名函数为:【但是不支持创建匿名函数同时立即调用】

$func = function($a) {
    return '费时间考虑'.$a;
}
$func('sf');

 

posted on 2020-05-12 14:33  Silentdoer  阅读(...)  评论(...编辑  收藏