PHP最全笔记(二)(值得收藏,不时翻看一下)

/* 【goto】5.3+ 版本 */
用来跳转到程序中的某一指定位置
该目标位置可以用目标名称 加上冒号来标记。
PHP中的goto有一定限制,只能在同一个文件和作用域中跳转,
    也就是说你无法跳出一个函数或类方法,也无法跳入到另一个函数。
    你也无法跳入到任何循环或者switch结构中。
    常见的用法是用来跳出循环或者switch,可以代替多层的break。 
可以从循环(switch)中跳出来,但不能从外部跳转进去。而函数或类方法,向外向内均不可。
goto a;
echo ‘Foo‘;
a:
echo ‘Bar‘;
/* 【文件加载】 */
require / include / require_once / include_once
文件载入只是载入目标文件内的代码并执行,与载入的文件类型无关
文件载入属于执行阶段,当执行到require等语句时,才载入该文件的代码,
    编译并执行,然后回到require等语句位置继续执行下面的语句
【注意】
    在载入开始时,先退出PHP模式;
    再载入目标文件代码,执行该代码;
    结束时,再进入PHP模式。
require:处理失败,产生 E_COMPILE_ERROR 错误,脚本中止。
include:处理失败,产生 E_WARNING 错误,脚本继续执行。
#不建议使用require_once/include_once
/* 【相对路径】 */
当前浏览器请求的哪个脚本,当前位置就是属于哪个脚本。
./file 和 file 都表示当前目录下的file文件
file情况(嵌套载入文件时):
如果当前目录没找到该文件就在代码文件所在目录中继续找。
如果当前目录找到有该文件,则不会再在代码文件所在目录去找也不会再加载。
__DIR__     脚本文件所在目录
__FILE__    脚本文件路径
include_path    加载文件查找目录
   set_include_path()  设置include_path,可多个,用字符串作参数
    该函数设置的path只针对该当前文件有效
    该设置只针对查找未直接写文件路径方式有效
    设置新的include_path会覆盖原来的
   get_include_path()  获取当前include_path设置项,无参数
    路径分隔符,在Windows下是分号,在Linux下是冒号
    利用预定义常量 PATH_SEPARATOR 来获得当前的分隔符
如果直接写文件名:
   1. include_path所设置的
   2. 当前目录
   3. 代码所在文件的目录
如果文件名前带有路径,则会直接根据路径查找,include_path直接被忽略
/* 【return】 */
return与require结合,可返回文件的内容,return写在被载入的文件内
return可以终止所在脚本的执行,作为普通脚本语句
return可以返回函数的相应值
/* 【终止和延迟脚本执行】 */
die / exit   终止
return是终止所在脚本的执行
die和exit会立即终止脚本执行
die("到此为止");     该函数内的字符串可被输出
sleep()  延迟(单位:秒)
    默认最多可延迟30秒,PHP配置可以修改 max_execution_time
    例:sleep(12);
usleep()    以指定的微秒数延迟执行
time_sleep_until    使脚本睡眠到指定的时间为止
/* 【函数】 */
1. 函数的声明是在编译时,故先定义再调用,定义与调用无先后关系!
2. 文件只是代码的载体,程序均在内存中执行!
3. 如果函数的定义在需要载入的文件内,则需要先载入该文件,否则调用出错!
4. 函数的定义可以出现在其他的代码段中,此时函数不会在编译阶段被执行
    只有被执行到时才会被定义!只有独立定义时才会被编译在内存中!
    如果出现在其他函数体内,也需要外层函数被调用时才被定义并生效!
5. 函数名不区分大小写
6. 不允许重名,包括系统函数
7. 【可变函数】
    函数名可以用其他变量代替
    $func_name = "sayHello";
    $func_name();       //此时调用sayHello()函数
    注意:只有在调用时才能使用变量,定义时不允许!
8. 变量可作为函数名调用函数,数组元素值也可以!
9. 形式参数parameter,实际参数argument
    可以对参数传递 null,表示该形参不想传递值
    形参与实参之间既可值传递,也可引用传递。
    引用传递参数,应该在定义函数时就在形式参数前加上 & 符号,而此时调用函数实参必须为变量
    如何选择使用哪种传递方式?
       a. 是否需要保证原始数据的完整性
       b. 是否需要增加效率
       c. 对大数据引用传递可节省内存
10. 参数默认值
       a. 函数的参数默认值必须是已经确定的值,不能是变量!
            只要在调用之前定义该常量,则可以使用常量作为参数默认值
       b. 函数默认值可以有多个,建议将有默认值的参数放在参数列表的最后面
           这样可以在调用函数时,不赋予后面有默认值的参数值,否则会出错
       c. 默认参数可以是非标量类型,比如数组、null
       d. 任何默认参数必须放在任何非默认参数的右侧
11. 参数数量
   a. 形参数量多于实参数量
        报告警告级别错误,并以NULL代替
   b. 实参多于形参
        不报告错误,依次为形参赋值
   c. 不确定参数数量
       1) 一个形参都不定义,永远都是实参多于形参
       2) 【可变数量参数】
           func_get_args() 获取当前函数被调用时所有实参的值,返回一个所有实参值组成的数组
           func_get_arg()  获取某个实参的值,通过索引值标识,e.g: func_get_arg(0)
           func_num_args() 获取所有实参的数量
12. 【return】返回值
   a. 函数只有一个返回值,可以通过返回一个数组来得到类似的结果,但可以有多条return语句
   b. return语句会立即中止函数的运行,并将控制权交回调用该函数的代码行
   c. 可以返回包括数组和对象的任意类型
   d. 函数的返回也分值传递和引用传递(返回的是一个变量才可)
       1) 默认是值传递方式
       2) 引用传递方式:
            - 定义函数时,函数名前加上& 表示该函数可以返回引用
            - 调用函数时,函数名前加上& 表示取得函数返回的引用
                此时,函数外修改返回值,会修改函数内的该返回变量的值
            - 如果函数需返回引用,则需要返回一个变量才可以
            - 从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用操作符&
               function &returns_reference(){return $someref;}
                $newref =& returns_reference();
       3) 返回引用的作用
/* 【变量作用域】 */
a. 全局变量和局部变量
   1) 作用域之间不重叠,即不同作用域的变量,之间不可访问
   2) 全局作用域  - 函数之外的区域
   3) 局部作用域  - 函数内的区域,每个函数都是一个独立的作用域
b. 超全局变量,既可以在全局也可在局部使用,仅能用系统自带的,均是数组变量。
    $GLOBALS    $_COOKIE    $_ENV       $_FILES $_GET
    $_POST      $_REQUEST   $_SERVER    $_SESSION
c. $GLOBALS
   1) 不能存在超全局变量,但可以有超全局的数据!
   2) 将需要的数据放到超全局变量的数组内,但统一使用$GLOBALS
   3) $GLOBALS 特征
        - 每个全局变量就是对应$GLOBALS内的一个元素!
            每当增加一个全局,则自动在$GLOBALS内增加一个同名元素!
            同理,每当增加元素,也会增加一个全局变量,一般在函数内增加
        - 做的任何修改,也会映射到另一个,包括更新和删除
            在函数内访问全局变量,只需使用$GLOBALS
        - 出现过的全局变量,就可以通过$GLOBALS这个数组取得
   4) PHP生命周期中,定义在函数体外部的所谓全局变量,函数内部是不能直接获得的
4) global关键字(不建议使用)
    将局部变量声明为同名全局变量的一个‘引用‘!相当于常量的引用传递
       global $var;    // $var = &$GLOBALS[‘var‘];
        不同于$GLOBALS!!!
   global在函数产生一个指向函数外部变量的别名变量,而不是真正的函数外部变量。
    $GLOBALS确确实实调用是外部的变量,函数内外会始终保持一致。
   global的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require的所有文件。
d. 
   1) 作用域只针对变量,对常量无效
   2) 被载入文件中定义的变量作用域取决于被载入的位置。
        函数外被载入就是全局,函数内被载入就是局部!
/* 【变量生命周期】 */
1. 脚本结束时,全局变量消失
2. 函数执行完时,局部变量消失
3. 静态变量
   static关键字
        静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。
        静态变量仅会被初始化一次,其他局部变量每次被调用时都会被重新赋值。
       static声明的静态变量的生命周期会被一直延续。
/* 【迭代和递归】 */
迭代比递归效率高!
迭代是一种思想(算法),结构和使用上如同循环!
递归是一种思想(算法),将大问题拆分成小问题,逐一解决小问题以解决大问题
    要求大问题和小问题的解决方案是一致的!
    递归的结构和语法体现如图函数。函数体内调用函数本身!
    递归出口:当该问题可以解决时,则不用再递归
/* 【匿名函数/闭包函数】 */
匿名函数,也叫闭包函数(closures),允许临时创建一个没有指定名称的函数。
1. 定义匿名函数时,不需增加函数名。
2. PHP对匿名函数的管理,以一个对象的方式进行处理。
3. 匿名函数应该存放到变量内。
4. 匿名函数通过Closure类来实现
5. 可以使用函数作为函数的参数和返回值
6. 声明函数时可以使用 use($param) 来向函数中传入函数外的变量,结合变量引用来实现闭包
7. 可以用变量引用函数
$func = function ($e) {
   echo $e;
};   //结束时,需分号结束,如同变量赋值
var_dump($func);     //使用匿名函数
$func(‘ITCAST‘);     //函数的调用
    这不是可变函数,而是对象。Closure闭包类
//use语法
匿名函数倾向于值的概念,可能出现在任何地方。
use可以使得匿名函数使用其外部作用域的变量。非全局!
use与全局的区别:
   use使用其外部作用域的变量
function out() {
    $v = "in out";
    $func = function () use (& $v) {
       var_dump($v);
    }
}
   use类似参数的自动传递,也支持值与引用的传递方式。
//作用
    常作为‘临时函数‘被调用(只在某个地方被调用的函数)
    例如:
       PHP存在一个array_map()函数,功能是针对一个函数内每个元素,去调用某个函数
        操作结果(array) = array_map(操作函数, 操作数组);
        $result_arr = array_map(function ($v) {return $v3}, $arr);
//闭包用法实例
function closureCreater() {
    $x = 1;
   return function($fun = null) use(&$x) {//按引用传值
       echo "<br />" . $x++;
        $fun and $fun();
    };
}
$x = "hello world";
$test = closureCreater();
$test();
$test(function(){ echo "closure test one"; });
$test(function(){ echo "closure test two"; });
$test(function() use($x){ echo "<br />".$x;});
//将函数保存为数组元素
$x = ‘outer param.‘;
$arr = array();
$arr[] = function($str)use($x){ return $str.$x; };
echo $arr[0](‘test fun in arr,‘);
/* 【数组】 */
关联数组:键和值有关联,键表示值的逻辑含义。
索引数组:键和值无关联,键表示值的位置。通常下标从0开始,递增元素
count($var [,$mode]) //统计数组元素个数
    $mode可选,设为1或true时则递归统计
    $var非数组,返回1;$var未初始化或等于null或空数组,返回0
//键名的使用
整型数字键不需加引号($arr[1])
字符串数字键也不需加引号($arr = array(‘1‘=>‘abc‘); $arr[1])
关联数组,字符串键需加引号($arr = array(‘a‘=>‘aaa‘); $arr[‘a‘])
关联数组,双引号中解析变量,可不加引号($arr = array(‘a‘=>‘aaa‘); "$arr[a]")
/* 【指针】 */
current/pos    返回当前被内部指针指向的数组单元的值,并不移动指针。
key            返回数组中当前单元的键名,并不移动指针
next        将数组中的内部指针向前移动一位,并返回移动后当前单元的值。先移动,再取值。
prev        将数组的内部指针倒回一位,并返回移动后当前单元的值先移动,再取值。
end            将数组的内部指针指向最后一个单元,并返回最后一个单元的值
reset        将数组的内部指针指向第一个单元,并返回第一个数组单元的值
each    返回数组中当前的键/值对并将数组指针向前移动一步。
            返回的是一个由键和值组成的长度为4的数组,下标0和key表示键,下标1和value表示值
                在执行each()之后,数组指针将停留在数组中的下一个单元
                    或者当碰到数组结尾时停留在最后一个单元。
                    如果要再用 each 遍历数组,必须使用 reset()。
   1. 以上指针操作函数,除了key(),若指针移出数组,则返回false。而key()移出则返回null。
   2. 若指针非法,不能进行next/prev操作,能进行reset/end操作
   3. current/next/prev     若遇到包含空单元(0或"")也会返回false。而each不会!
list    把数组中的值赋给一些变量。list()是语言结构,不是函数
            仅能用于数字索引的数组并假定数字索引从0开始
            /* 可用于交换多个变量的值 */ list($a, $b) = array($b, $a);
    例:list($drink, , $power) = array(‘coffee‘, ‘brown‘, ‘caffeine‘);
1. 复制数组,其指针位置也会被复制。
    特例:如果数组指针非法,则拷贝的数组指针会重置,而原数组的指针不变。
    【指针问题】
        谁第一个进行写操作,就会开辟一个新的值空间。与变量(数组变量)值传递给谁无关。
        数组函数current()被定义为写操作,故会出现问题。
       foreach遍历的是数组的拷贝,当被写时,才会开辟一个新的值空间。
            即,foreach循环体对原数组进行写操作时,才会出现指针问题。
            如果开辟新空间时指针非法,则会初始化指针。
2. 如果指针位置出现问题,则reset()初始化一下就可解决。
/* 【遍历数组】 */
* 先找到元素,再获取键和值
foreach
   foreach (array_expression as [$key =>] & $value)
      当foreach开始执行时,数组内部的指针会自动指向第一个单元。
      获取元素信息后,移动指针,再执行循环体
     1. foreach本身循环结构,break和continue适用于foreach
     2. foreach支持循环的替代语法。
     3. $value是保存元素值的变量,对其修改不会改变数组的元素值
     4. $value支持元素值的引用拷贝,在$value前加上&即可
     5. $key不支持引用传递
     6. foreach遍历的是原数组的拷贝,而在循环体对数组的操作是操作原数组
            即循环体对数组的操作,对原数组生效,对遍历不生效。
            先拷贝一份数组用作遍历
while...list...each
while (list($key, $val) = mysql_fetch_row($result)) = each($arr) {
 echo "$key => $val\n";
}

时间: 11-25

PHP最全笔记(二)(值得收藏,不时翻看一下)的相关文章

史上最全最常用的正则表达式-(基本够用值得收藏)

一.校验数字的表达式 1 数字:^[0-9]*$ 2 n位的数字:^\d{n}$ 3 至少n位的数字:^\d{n,}$ 4 m-n位的数字:^\d{m,n}$ 5 零和非零开头的数字:^(0|[1-9][0-9]*)$ 6 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$ 7 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$ 8 正数.负数.和小数:^(\-|\+)?\d+(\.\d+)?$ 9 有两位小数的正实数:^[0-9]

10个Web前端值得收藏的背景全屏效果展示(附源码)(上)

作为一个前沿的 Web 开发者,对于 HTML5 和 现在流行的3D技术或多或少都有掌握.特别是在移动端大显身手.这篇文章挑选了10个绚丽的背景全景展示效果,希望对你有所帮助. 1.  JS图片背景全屏代码实现物理效果 玩法介绍:可以随意拖动鼠标.按住鼠标左键选中旋转物体.或者按住鼠标滑轮放大或者缩小,有不同的效果,赶紧来体验一下. 源码下载  /  在线演示 2.  CSS3学习 - 网站背景拉伸平铺jQuery插件 这个插件集成了一些非常好的 JavaScript 库,提供一个方便使用的文本

创业的态度 值得收藏

本文来自First Round Review,他们准备的文章既讲故事,还同时向创业者提供可操作的建议,以助力打造优秀的公司.在最初创立的时候,Squarespace只是Anthony Casalena为自己搞的个人网站,在Wordpress和Drupal面前,它不值一提.今天,它已然崛起,累计融资达7850万美元.用了对的方法,解决了对的问题,它于是逐渐壮大成了今天的样子... Squarespace 的最初版本只是 Anthony Casalena 为自己搞的个人网站.这是一个普通的创业故事.

《逻辑思维简易入门》(第2版) 阅读笔记二

<逻辑思维简易入门>(第2版) 阅读笔记二 本周阅读的是<逻辑思维简易入门>的第三章,也就是说,本书的第一部分就已经读完了. 第三章.信念的优点 信念和负信念是人们在接受一个事物时一种心理态度,延伸来说也就是对事物的认知态度.因为我们在研究 逻辑思维的时候,都有一个前提:“以正常情况以及说话者真诚”,所以有人如果对于一件事物不做回应,我们可以认为这是一种既不相信,也不怀疑的的态度. 信念的优缺点有很多,在书中主要介绍了下面几种: 1.准确性 好的信念实在准确的表达事实,同样真的信念

21个值得收藏的javas技巧

在本文中列出了21个值得收藏的Javascript技巧,在实际工作中,如果能适当运用,则大大提高工作效率. 1 Javascript数组转换为CSV格式 首先考虑如下的应用场景,有一个Javscript的字符型(或者数值型)数组,现在需要转换为以逗号分割的CSV格式文件.则我们可以使用如下的小技巧,代码如下: var fruits = ['apple', 'peaches', 'oranges', 'mangoes']; var str = fruits.valueOf(); 输出:apple,

webpy使用笔记(二) session/sessionid的使用

webpy使用笔记(二) session的使用 webpy使用系列之session的使用,虽然工作中使用的是django,但是自己并不喜欢那种大而全的东西~什么都给你准备好了,自己好像一个机器人一样赶着重复的基本工作,从在学校时候就养成了追究原理的习惯,从而有了这篇session的使用和说明. PS:其实有些总结的东西挺好的,想分享给大家看,而不是枯燥的代码,这东西说实话对其他人用处不大,但都被移除首页了~~ webpy中的session 下面为官方的例子,用session来存储页面访问的次数,

Swift学习笔记(二)参数类型

关于参数类型,在以前的编程过程中,很多时间都忽视了形参与实参的区别.通过这两天的学习,算是捡回了漏掉的知识. 在swift中,参数有形参和实参之分,形参即只能在函数内部调用的参数,默认是不能修改的,如果想要修改就需要在参数前添加var声明. 但这样的声明过后,仍旧不会改变实参的值,这样就要用到inout了,传递给inout的参数类型必须是var类型的,不能是let类型或者字面类型,(字面类型是在swift中常提的一个术语,个人认为就是赋值语句,也不能修改)而且在传递过程中,要用传值符号"&

Android学习笔记二十九之SwipeRefreshLayout、RecyclerView和CardView

Android学习笔记二十九之SwipeRefreshLayout.RecyclerView和CardView 前面我们介绍了AlertDialog和几个常用的Dialog,ProgressDialog进度条提示框.DatePickerDialog日期选择对话框和TimePickerDialog时间选择对话框.这一节我们介绍几个新的API控件SwipeRefreshLayout.RecyclerView和CardView,这几个API控件都是google在Android5.0推出的.下面我们来学

JAVA笔记二

JAVA笔记二 常量:表示不可改变的值 变量:将不确定的数据进行存储也就是需要在内存中开辟一个空间 如何开辟内存空间? 就是通过明确的的数据类型 变量名称 数据来完成 Integer.toBinaryString(number); JAVA提供转换二进制的方法; number表示转换成二进制的数字 两个变量不通过第三个变量进行两个值得交换 1.int a=3,b=8; a=a+b; a=a-b; b=a-b; 此方法有局限性比如说a+b的大于2^32-1就会出现错误 我们可以通过异或运算来进行交

21个值得收藏的Javascript技巧

在本文中列出了21个值得收藏的Javascript技巧,在实际工作中,如果能适当运用,则大大提高工作效率. 1  Javascript数组转换为CSV格式 首先考虑如下的应用场景,有一个Javscript的字符型(或者数值型)数组,现在需要转换为以逗号分割的CSV格式文件.则我们可以使用如下的小技巧,代码如下: 1 2 var fruits = ['apple', 'peaches', 'oranges', 'mangoes']; var str = fruits.valueOf(); 输出:a