• 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 variable
    class 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开发要点与技巧总结(一)的更多相关文章

  1. PHP开发要点与技巧总结(二)

    1 == 'a'.0 == 'a'.97 == '97a'?这里边牵涉到的是默认数据类型转换. // 无输出 if ('0') { echo "'0' is true\n"; } ...

  2. 一文看懂汽车电子ECU bootloader工作原理及开发要点

    随着半导体技术的不断进步(按照摩尔定律),MCU内部集成的逻辑功能外设越来越多,存储器也越来越大.消费者对于汽车节能(经济和法规对排放的要求)型.舒适性.互联性.安全性(功能安全和信息安全)的要求越来 ...

  3. JS~~~ 前端开发一些常用技巧 模块化结构 &&&&& 命名空间处理 奇技淫巧!!!!!!

    前端开发一些常用技巧               模块化结构       &&&&&     命名空间处理 奇技淫巧!!!!!!2016-09-29    17 ...

  4. Windows SharePoint Services 3.0编码开发工具和技巧(Part 1 of 2)

    转:http://blog.csdn.net/mattwin/article/details/2074984 WSSv3 Technical Articles_Windows SharePoint S ...

  5. 15 个 Eclipse 常用开发快捷键使用技巧

    15 个 Eclipse 常用开发快捷键使用技巧 1.alt+? 或 alt+/:自动补全代码或者提示代码 2.ctrl+o:快速outline视图 3.ctrl+shift+r:打开资源列表 4.c ...

  6. Android开发——ListView使用技巧总结(二)

    0.  前言 Android中的ListView是用的比较多的控件之一,在上一篇Android开发--ListView使用技巧总结(一)中对ListView的ViewHolder机制.优化卡顿方式以及 ...

  7. Android开发——ListView使用技巧总结(一)

    )还有一点就是要控制异步任务的执行频率,因为当用户频繁的上下滑动,会瞬间产生上百个异步任务,会带来无意义的大量的UI更新操作,因此可以考虑在列表滑动时停止进行异步任务,直到列表停下来. //判断列表的 ...

  8. Delphi开发的一些技巧

    [Delphi]Delphi开发的一些技巧 一.提高查询效率先进行准备查询操作: CustomerQuery.Close; if not (CustomerQuery.Prepared) then - ...

  9. 五个goland进行go开发的小技巧

    五个goland进行go开发的小技巧 本文译自5 Tips To Speed Up Golang Development With IntelliJ Or Goland 确实很实用. 1. 实现int ...

随机推荐

  1. Web颜色对照表大全

    Web上16种基本颜色名称 Name Hex (RGB) Red (RGB) Green (RGB) Blue (RGB) Hue (HSL/HSV) Satur. (HSL) Light (HSL) ...

  2. 个人作业3—个人总结(Alpha阶段)

    一.个人总结 在Alpha阶段,我们团队通过合作的方式,完成了之前觉得不大可能会完成的事(至少在我看来是这样的),大家其实之前的写代码能力都不太好,这期间大家都是边学边做,边做边学,最后跌跌撞撞的完成 ...

  3. 【Alpha】Daily Scrum Meeting——Day3

    站立式会议照片 1.本次会议为第三次 Meeting会议: 2.本次会议于早上9:40在陆大楼召开,本次会议为30分钟讨论昨天的任务完成情况以及接下来的任务安排. 每个人的工作分配 成 员 昨天已完成 ...

  4. 201521123037 《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. java异常继承架构 2. 书面作业 本次PTA作业题集异常 1. 常用异常 题目5-1 1.1 截图你的提交结果( ...

  5. 201521123009 《Java程序设计》第12周学习总结

    1. 本周学习总结 2. 书面作业 Q1:将Student对象(属性:int id, String name,int age,double grade)写入文件student.data.从文件读出显示 ...

  6. 201521123085 《Java程序设计》第11周学习总结

    1. 本周学习总结 2. 书面作业 本次PTA作业题集多线程 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchronized修饰方法实现互斥同步访问,还有 ...

  7. PHP封装数据库连接

    将数据库连接放在类里面,用的时候直接实例化类. 将数据库地址,用户名,密码做成成员变量 将数据库连接做成成员方法,通过传入的sql语句返回结果集对象 class DBDA{ public $host= ...

  8. eclipse中svn插件在线安装方式

    SVN插件地址:http://subclipse.tigris.org/update_1.8.x 第一步:eclipse>Help菜单>Install New Software- 第二步: ...

  9. JVM菜鸟进阶高手之路一(一次与笨神,阿飞近距离接触修改JVM)

    转载请注明原创出处,谢谢! 今天在JVMPocket群里面看见,阿牛发了一个gc截图,之后ak47截图了特别恐怖,我就觉得好奇,去看看服务情况,截图日志如下 关于jstat命令详情可以参考:https ...

  10. STS安装

    在eclipse中安装spring tool Suite插件需要根据eclipse版本找到对应的spring tool Suite安装包. spring tool Suite 官网地址:http:// ...