PHP实用功能——modern PHP读书笔记(一)

PHP实用功能——modern PHP读书笔记

(原创内容,转载请注明来源,谢谢)

一、命名空间

1、命名空间按照虚拟的层次结构组织PHP代码,类似操作系统的目录结构。

2、定义命名空间的方式放在<?php后的第一行(除注释外),如果有需要导入的命名空间,其代码放于定义的后面,PHP解释器会将命名空间作为前缀加到类、接口、函数、常量名称前。

3、方式:

定义:namespace 路径\二级路径\.....; 这里的路径指的是虚拟的路径

导入:use 路径\文件名(不用路径)\类名 [as 别名]; 这里as可以重命名类名。

从PHP5.6开始,支持导入常量和方法,方法如下:

1)导入方法:use func…\functionname;

2)导入常量:useconstant …\constname;

4、不建议一个文件中定义两个命名空间。

5、如果定义了一个命名空间,那么在该文件中如果调用PHP原生类,则需要在类前面加入一个反斜杠\,以此表示根命名空间下的类。例如要调用PHP的Exception类,应采用\Exception()的方式。

二、性状(trait) PHP5.4

1、使用场景

当两个完全无关的类,需要实现同一个方法,则采用性状的方式最为合适。例如,现有汽车类和大楼类这两个类,都需要添加一个定位的功能,如果在两个类中分别去实现,代码重复率高,而且当有需要修改的时候还需要分别去修改,比较麻烦,则可以使用trait的方式进行操作。

2、使用方法

定义:

traittesttrait{
    private $testprop;
public function testfunc(){
}
}

使用:

class testclass{
         use testtrait;
    public functiontestclassfunc(){
                   $this->testfunc();
}
}

三、生成器(generator) PHP5.5

1、优势

当需要操作大文件、大数组等占用大量内存的工作时,使用生成器,会对文件的逐行、数组的逐个内容进行读取,并且仅开辟一个内存空间,节省了大量的内存。

2、生成器相当于简化版的迭代器,它只能逐个读取,不能读取上一个,也不能快进,不能进行查询某一个内容,对于需要逐个操作的场景使用广泛,但是对于需要退后、快进等的场景则还是需要使用PHP SPL迭代器,或者自己写类来实现Iterator接口。

3、使用方式(关键字 yield)

定义:

functiontestfunc(){
    for($i=0;$i<=100000;$i++){
                   yield $i;
}
}

使用:(只能使用foreach使用)

foreach(testfunc as $num){
         echo $num;//会输出0-100000
}

上述场景中,如果使用常规的数组来接收0-100000,则需要一个空间为100001的数组用于保存内容,占用大量的空间。但是使用yield,则每次只用一个空间为1的数组来保存内容,当foreach到下一个内容时,仍使用该内存。

四、闭包PHP5.3

1、闭包与匿名函数在PHP中是同一个概念,都是PHPClosure类的实例,闭包函数设计的初衷是为了增加函数的复用性。

2、使用方式

定义:

         $test= function($a){return $a+1;}

使用:

         echo$test(1);//输出结果为2

3、当变量后面出现括号(),即当尝试以调用函数的方式调用一个对象时,则PHP会自动调用魔术方法__invoke()。

__invoke()示例:

classtestinvoke{
   publicfunction __invoke($x){
      echo $x;
}
}
$test = newtestinvoke();
$test(‘a’); //输出 a

4、在闭包中使用use(),可以使用闭包之外的变量,并且当闭包函数执行完毕时该变量仍在。

functiongetNames($lastname){
    returnfunction($firstname) use ($lastname){
         return $firstname.’’.$lastname;
}
}
$name =getNames(‘hxx’);
echo$name(‘lin’);//输出linhxx

5、闭包函数中使用bindTo()方法

五、Zend Opacache 字节码缓存(PHP 5.5)

该内容后续文章中讲解,先挖个坑。

六、PHP内置的web服务器

除了常用的Apache、Nginx外,PHP内部也有web服务器,但由于该服务器每次只能处理一个请求,不适用于生产系统,但是对于开发调试还是可以使用。

1、开启: php –s localhost:8000

2、加载自定义配置文件 php –s localhost:8000–c app/confing/php.ini

3、PHP查询当前使用的服务器名称的方式

         echophp_sapi_name();//使用内置服务器,会输出 cli_server

——written by linhxx 2017.06.25

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-06-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏C语言及其他语言

【每日一题】1452:[蓝桥杯][历届试题]网络寻路

题目描述 X 国的一个网络使用若干条线路连接若干个节点。节点间的通信是双向的。某重要数据包,为了安全起见,必须恰好被转发两次到达目的地。该包可能在任意一个节点...

2648
来自专栏程序员互动联盟

【编程基础】C函数的调用过程

这几天在看GCC Inline Assembly,在C代码中通过asm或__asm__嵌入一些汇编代码,如进行系统调用,使用寄存器以提高性能能,需要对函数调用过...

3065
来自专栏精讲JAVA

Java 虚拟机 4:内存溢出

Java堆唯一的作用就是存储对象实例,只要保证不断创建对象并且对象不被回收,那么对象数量达到最大堆容量限制后就会产生内存溢出异常了。所以测试的时候把堆的大小固定...

762
来自专栏ShaoYL

堆和栈的区别

25610
来自专栏python学习指南

操作系统六文件管理

第六章 文件管理 一、前言 本篇是操作系统系列的最后一篇,文件管理,由于系统的内部内存有限并且不能长期保存,故平时总是把她们以文件的形式保存在外村中,需要时再...

1748
来自专栏个人分享

SparkConf加载与SparkContext创建(源码阅读二)

  1、下面,开始创建BroadcastManager,就是传说中的广播变量管理器。BroadcastManager用于将配置信息和序列化后的RDD、Job以及...

632
来自专栏Linyb极客之路

工作流引擎之activiti入门

在解释activiti之前我们看一下什么是工作流。 工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个...

804
来自专栏python3

python标准库--logging模块

它们的值为0-50(也可以自定义级别),这些级别的用处是,先将自己的日志定一个级别,logging模块发出的信息级别高于定义的级别,将在标准输出(屏幕)显示出来...

641
来自专栏xingoo, 一个梦想做发明家的程序员

堆 栈-相关知识

一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量...

1698
来自专栏测试开发架构之路

堆和栈的区别

一、预备知识—程序的内存分配          一个由C/C++编译的程序占用的内存分为以下几个部分     1、栈区(stack)— 由编译器自动分配释放,存...

2618

扫描关注云+社区