PHP开发要点与技巧总结(一)
- Opcache:Opcache 来源于Zend Optimizer+改名,主要作用是通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是省去了每次加载和解析 PHP 脚本的开销,但是对于I/O开销如读写磁盘文件、读写数据库等并无影响。Opcache 很有可能取代 APC 的位置,虽然没有 APC 那样的 user cache 功能。另外 Opcache 可能与eaccelerator、xcache 或 apc 等类似组件相冲突。
字节码(Byte Code):一种包含执行程序比机器码更抽象的中间码,由一序列 op代码/数据对组成的二进制文件。
比如Java源码经编译后生成的字节码在运行时通过JVM(JVM针对不同平台有不同版本,Java程序在JVM中运行而称
为解释性语言Interpreted)再做一次转换生成机器码,才能够跨平台运行;C#也类似,EXE文件的执行依赖.NET
Framework;HHVM(HipHop Virtual Machine,Facebook开源的PHP虚拟机)采用了JIT(Just In Time
Just Compiling,即时编译)技术,在运行时编译字节码为机器码,让他们的PHP性能测试提升了一个数量级。
唯有C/C++编译生成的二进制文件可直接运行。机器码(Machine Code):也被称为原生码(Native Code),用二进制代码表示的计算机能直接识别和执行的一种
机器指令的集合,它是计算机硬件结构赋予的操作功能。 - PHP-FPM进程池:FastCGI Process Manager 的master process是常驻内存的,以static、dynamic、ondemand三种方式来管理进程池中的worker process,可以有效控制内存和进程并平滑重载PHP配置,在发生意外情况的时候能够重新启动并恢复被破坏的 opcode。参考本人此篇 PHP-FPM进程池探秘 。
- 数据类型:PHP 支持 9 种原始数据类型:
四种标量类型:
1. boolean(布尔型)
2. integer(整型)
3. float(浮点型,也称作 double)
4. string(字符串) 三种复合类型:
1. array(数组)
2. object(对象)
3. callable(可调用) 最后是两种特殊类型:
1. resource(资源)
2. NULL(无类型) - Lambda表达式(匿名函数)与闭包:Lambda表达式(匿名函数)实现了一次执行且无污染的函数定义,是抛弃型函数并且不维护任何类型的状态。闭包在匿名函数的基础上增加了与外部环境的变量交互,通过
use
子句中指定要导入的外部环境变量function getClosure($n)
{
$a = 100;
return function($m) use ($n, &$a) {
$a += $n + $m;
echo $a."\n";
};
}
$fn = getClosure(1);
$fn(1);//
$fn(2);//
$fn(3);//
echo $a;//Notice: Undefined variableclass Dog
{
private $_name;
protected $_color; public function __construct($name, $color)
{
$this->_name = $name;
$this->_color = $color;
} public function greet($greeting)
{
return function() use ($greeting) {
//类中闭包可通过 $this 变量导入对象
echo "$greeting, I am a {$this->_color} dog named {$this->_name}.\n";
};
} public function swim()
{
return static function() {
//类中静态闭包不可通过 $this 变量导入对象,由于无需将对象导入闭包中,
//因此可以节省大量内存,尤其是在拥有许多不需要此功能的闭包时。
echo "swimming....\n";
};
} private function privateMethod()
{
echo "You have accessed to {$this->_name}'s privateMethod().\n";
} public function __invoke()
{
//此方法允许对象本身被调用为闭包
echo "I am a dog!\n";
}
} $dog = new Dog("Rover","red");
$dog->greet("Hello")();
$dog->swim()();
$dog();
//通过ReflectionClass、ReflectionMethod来动态创建闭包,并实现直接调用非公开方法。
$class = new ReflectionClass('Dog');
$closure = $class->getMethod('privateMethod')->getClosure($dog);
$closure(); - 单/双引号、Heredoc、Nowdoc:单引号字符串中只需要转义单引号(\')、反斜杠(\\),其余原样输出;双引号字符串中的变量将被解析;Heredoc 结构类似于双引号字符串;Nowdoc类似于单引号字符串,nowdoc 结构和 heredocs 结构使用一样的标记 <<<, 但是跟在后面的标识符要用单引号括起来,即 <<<'EOT'
- 字串变量解析:可分为$解析和{}解析。$解析就是解析出$引出的有效变量,{}解析则是解析{}中引出的变量
- SQL注入风险:以下为列举部分
1. addslashes函数转义风险:对于URL参数arg = %df\'在经过addslashes转义后在GBK编码下arg = 運'
2. urldecode函数解码风险:对于URL参数uid = 1%2527在调用urldecode函数解码(二次解码)后将变成uid = 1' - 大小写转换:
$str = preg_replace_callback(
'/([a-z]*)([A-Z]*)/',
function($matchs){
return strtoupper($matchs[1]).strtolower($matchs[2]);
},
$str
); - 二进制安全:C字符串以空字符('\0')为结束标志,这使得C字符串不能保存像图片、音频、视频、压缩文件这样的二进制数据,反之则称作二进制安全的。这个概念在PHP中经常提到,此处只做个简单解释。下面是Redis 简单动态字符串(SDS)的实现,它是二进制安全的:
// 文件路径:src/sds.h
struct sdshdr {
// 记录buf数组中已使用字节的数量
int len; // 记录buf数组中未使用字节的数量
int free; // 字节数组,用于保存字符串
char buf[];
}; - / 和 % 以及 ** 运算符:取模运算符%的操作数在运算之前都会转换成整数(除去小数部分),取模运算符%的结果和被除数的符号(正负号)相同,** 表示乘方运算
5 / 3;//1.6666666666667
5.7 % 3;//
5 % 3;//
2 ** 3;// - 运算符优先级:优先级从上到下依次降低
结合方向 运算符 附加信息 无 clone new clone 和 new 左 [ array() 右 ** 算术运算符 右 ++ -- ~ (int) (float) (string) (array) (object) (bool) @ 类型和递增/递减 无 instanceof 类型 右 ! 逻辑运算符 左 * / % 算术运算符 左 + - . 算术运算符和字符串运算符 左 << >> 位运算符 无 < <= > >= 比较运算符 无 == != === !== <> <=> 比较运算符 左 & 位运算符和引用 左 ^ 位运算符 左 | 位运算符 左 && 逻辑运算符 左 || 逻辑运算符 左 ?? 比较运算符 左 ? : ternary 右 = += -= *= **= /= .= %= &= |= ^= <<= >>= 赋值运算符 左 and 逻辑运算符 左 xor 逻辑运算符 左 or 逻辑运算符 - unset() 与 NULL:删除引用,触发相应变量容器refcount减一,但在函数中的行为会依赖于想要销毁的变量的类型而有所不同,比如unset 一个全局变量,则只是局部变量被销毁,而在调用环境中的变量(包括函数参数引用传递的变量)将保持调用 unset 之前一样的值;unset 变量与给变量赋值NULL不同,变量赋值NULL直接对相应变量容器refcount = 0
//示例一:函数内销毁全局变量$foo是无效的
function destroy_foo() {
global $foo;
unset($foo);
echo $foo;//Notice: Undefined variable: foo
} $foo = 'bar';
destroy_foo();
echo $foo;//bar //示例二:要在函数中 unset 一个全局变量,应使用 $GLOBALS 数组来实现
function foo()
{
unset($GLOBALS['bar']);
} $bar = "something";
foo();
echo $bar;//Notice: Undefined variable: bar - pack()与unpack():这两个函数可用作socket编程时的二进制串编码/解码函数
$binarydata = pack("nvc*", 0x1234, 0x5678, 65, 66);//Pack data into binary string
$array = unpack("c4chars/nint", $binarydata);//Unpack data from binary string
print_r($array);//Array ( [chars1] => 19 [chars2] => 52 [chars3] => 24 [chars4] => 22 [int] => 16706 ) PHP7 - Group Use用法:
// Proposed group use syntax: use FooLibrary\Bar\Baz\{ ClassA, ClassB, ClassC, ClassD as Fizbo }; // Compared to current use syntax: use FooLibrary\Bar\Baz\ClassA;
use FooLibrary\Bar\Baz\ClassB;
use FooLibrary\Bar\Baz\ClassC;
use FooLibrary\Bar\Baz\ClassD as Fizbo;- PHP7 - NULL合并运算符(??):某些情况下不等于?:,如
//string(0) "" string(3) "err"
var_dump($a = '' ?? 'err', $a = '' ?: 'err');$a ?? $b ?? $c 表示从左往右第一个存在且不为 NULL 的操作数。如果都没有定义,则返回 NULL。
// Fetches the request parameter user and results in 'nobody' if it doesn't exist
$username = $_GET['user'] ?? 'nobody';
// equivalent to: $username = isset($_GET['user']) ? $_GET['user'] : 'nobody'; - PHP7 - 合并比较运算符(<=>):补充一下,MySQL中也定义了该运算符,但只返回0或1,且可用于null值比较。
operator <=>
equivalent$a < $b
($a <=> $b) === -1
$a <= $b
($a <=> $b) === -1 || ($a <=> $b) === 0
$a == $b
($a <=> $b) === 0
$a != $b
($a <=> $b) !== 0
$a >= $b
($a <=> $b) === 1 || ($a <=> $b) === 0
$a > $b
($a <=> $b) === 1
- PHP7 - 用户层随机数生成器:更安全方便
1. random_bytes(int length):Generates cryptographically secure pseudo-random bytes, such as when generating salts, keys or initialization vectors. 2. random_int(int min, int max):Generates cryptographically secure pseudo-random integers, such as when shuffling a deck of cards for a poker game.
$bytes = random_bytes(5);
var_dump(bin2hex($bytes));//string(10) "385e33f741"
var_dump(random_int(100, 999));//int(248) PHP7 - declare(strict_type=1):PHP7新增int、float、string和bool这4种标量类型声明,declare(strict_type=1)将使PHP不在自动对数据类型进行转换,PHP因此而成为了强类型语言。declare(strict_type=1)必须是文件的第一个语句,只影响当前文件内的全部函数调用,不会影响被它包含(通过include等方式)进来的其他文件。
- PHP7 - 可捕获的Error:PHP7实现了一个全局的throwable接口,原来的Exception和部分Error都实现了这个接口,可捕获Error像Exception一样返回给开发者,如果不进行捕获则为Error。如果一个Error抛出后没有被捕获,而且又没用使用 set_error_handler() / set_exception_handler()作相应的处理的话,那么 PHP 将会产生一个Fatal error,并且输出 Uncaught ......。Error与Exception一样,需要自己抛出,然后再捕获。
PHP开发要点与技巧总结(一)的更多相关文章
- PHP开发要点与技巧总结(二)
1 == 'a'.0 == 'a'.97 == '97a'?这里边牵涉到的是默认数据类型转换. // 无输出 if ('0') { echo "'0' is true\n"; } ...
- 一文看懂汽车电子ECU bootloader工作原理及开发要点
随着半导体技术的不断进步(按照摩尔定律),MCU内部集成的逻辑功能外设越来越多,存储器也越来越大.消费者对于汽车节能(经济和法规对排放的要求)型.舒适性.互联性.安全性(功能安全和信息安全)的要求越来 ...
- JS~~~ 前端开发一些常用技巧 模块化结构 &&&&& 命名空间处理 奇技淫巧!!!!!!
前端开发一些常用技巧 模块化结构 &&&&& 命名空间处理 奇技淫巧!!!!!!2016-09-29 17 ...
- Windows SharePoint Services 3.0编码开发工具和技巧(Part 1 of 2)
转:http://blog.csdn.net/mattwin/article/details/2074984 WSSv3 Technical Articles_Windows SharePoint S ...
- 15 个 Eclipse 常用开发快捷键使用技巧
15 个 Eclipse 常用开发快捷键使用技巧 1.alt+? 或 alt+/:自动补全代码或者提示代码 2.ctrl+o:快速outline视图 3.ctrl+shift+r:打开资源列表 4.c ...
- Android开发——ListView使用技巧总结(二)
0. 前言 Android中的ListView是用的比较多的控件之一,在上一篇Android开发--ListView使用技巧总结(一)中对ListView的ViewHolder机制.优化卡顿方式以及 ...
- Android开发——ListView使用技巧总结(一)
)还有一点就是要控制异步任务的执行频率,因为当用户频繁的上下滑动,会瞬间产生上百个异步任务,会带来无意义的大量的UI更新操作,因此可以考虑在列表滑动时停止进行异步任务,直到列表停下来. //判断列表的 ...
- Delphi开发的一些技巧
[Delphi]Delphi开发的一些技巧 一.提高查询效率先进行准备查询操作: CustomerQuery.Close; if not (CustomerQuery.Prepared) then - ...
- 五个goland进行go开发的小技巧
五个goland进行go开发的小技巧 本文译自5 Tips To Speed Up Golang Development With IntelliJ Or Goland 确实很实用. 1. 实现int ...
随机推荐
- Web颜色对照表大全
Web上16种基本颜色名称 Name Hex (RGB) Red (RGB) Green (RGB) Blue (RGB) Hue (HSL/HSV) Satur. (HSL) Light (HSL) ...
- 个人作业3—个人总结(Alpha阶段)
一.个人总结 在Alpha阶段,我们团队通过合作的方式,完成了之前觉得不大可能会完成的事(至少在我看来是这样的),大家其实之前的写代码能力都不太好,这期间大家都是边学边做,边做边学,最后跌跌撞撞的完成 ...
- 【Alpha】Daily Scrum Meeting——Day3
站立式会议照片 1.本次会议为第三次 Meeting会议: 2.本次会议于早上9:40在陆大楼召开,本次会议为30分钟讨论昨天的任务完成情况以及接下来的任务安排. 每个人的工作分配 成 员 昨天已完成 ...
- 201521123037 《Java程序设计》第9周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. java异常继承架构 2. 书面作业 本次PTA作业题集异常 1. 常用异常 题目5-1 1.1 截图你的提交结果( ...
- 201521123009 《Java程序设计》第12周学习总结
1. 本周学习总结 2. 书面作业 Q1:将Student对象(属性:int id, String name,int age,double grade)写入文件student.data.从文件读出显示 ...
- 201521123085 《Java程序设计》第11周学习总结
1. 本周学习总结 2. 书面作业 本次PTA作业题集多线程 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchronized修饰方法实现互斥同步访问,还有 ...
- PHP封装数据库连接
将数据库连接放在类里面,用的时候直接实例化类. 将数据库地址,用户名,密码做成成员变量 将数据库连接做成成员方法,通过传入的sql语句返回结果集对象 class DBDA{ public $host= ...
- eclipse中svn插件在线安装方式
SVN插件地址:http://subclipse.tigris.org/update_1.8.x 第一步:eclipse>Help菜单>Install New Software- 第二步: ...
- JVM菜鸟进阶高手之路一(一次与笨神,阿飞近距离接触修改JVM)
转载请注明原创出处,谢谢! 今天在JVMPocket群里面看见,阿牛发了一个gc截图,之后ak47截图了特别恐怖,我就觉得好奇,去看看服务情况,截图日志如下 关于jstat命令详情可以参考:https ...
- STS安装
在eclipse中安装spring tool Suite插件需要根据eclipse版本找到对应的spring tool Suite安装包. spring tool Suite 官网地址:http:// ...