【精粹系列】PHP精粹

点击关注微信公众号 wenyuqinghuai
分享提纲:
2.10 调试技巧
1. 概述
关于PHP整理的需要记忆和熟练掌握的内容
2. 精粹内容
2.1)【语言结构】
eval(): eval() 函数把字符串按照 PHP 代码来计算,该字符串必须是合法的 PHP 代码,且必须以分号结尾(详见 http://www.w3school.com.cn/php/func_misc_eval.asp)
2.2)【大小写问题】
- 类名、方法名、属性名、函数名:不区分大小写
- 变量名、常量名、元素下标:区分大小写
2.3) 【变量函数 】
get_defined_vars //返回由所有已定义变量所组成的数组(包括环境变量、服务器变量和用户定义的变量)
2.4)【常量相关函数】
defined
get_defined_constants
2.5)【字符串的使用】
可将字符串当作一个字符的集合来使用,可独立访问每个字符。仅适用于单字节字符(字母、数字、半角标点符号),像中文等不可用
$str = "abcd";
echo $str[3]; // d
echo $str{0}; // a
2.6)【函数】
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) 返回引用的作用 13)PHP Math 函数 1)decbin() 函数把十进制转换为二进制
2)pow() 函数返回 x 的 y 次方。
3)abs() 绝对值。
4)bindec() 把二进制转换为十进制
5)ceil() 向上舍入为最接近的整数
6)floor() 向下舍入为最接近的整数。
7)max() 返回最大值
8)min() 返回最小值
9)rand() 返回随机整数
10)round() 对浮点数进行四舍五入
函数
2.7)【数据库操作】
#连接认证
mysql_connect 连接并认证数据库
#发送SQL语句,接收执行结果
mysql_query 发送SQL语句
仅对select, show, explain, describe语句执行成功返回一个资源标识符,其他语句成功返回true。执行失败均返回false。
#处理结果
mysql_fetch_assoc 从结果集中取得一行作为关联数组
每次只取回一条,类似each
结果集中记录指针
mysql_fetch_row 从结果集中取得一行作为枚举数组
mysql_fetch_array 从结果集中取得一行作为关联数组,或数字数组,或二者兼有
array mysql_fetch_array ( resource $result [, int $ result_type ] )
可选参数result_type可选值为:MYSQL_ASSOC,MYSQL_NUM 和 MYSQL_BOTH(默认)
mysql_free_result 释放结果内存
#关闭链接
mysql_close 关闭连接
2.8)【自动加载对象】
- 在试图使用尚未被定义的类时自动调用 __autoload 函数
- 自动加载使用到的类名文件(根据类名找相应名称的文件,故需类名与类文件名一致)
- 每个需要加载类的文件都需要存在__autoload函数
- 将__autoload函数写入单独的文件,每个需要用到类的文件再require该函数文件
- __autoload 参数是类名
function __autoload($class_name) {
require_once $_SERVER["DOCUMENT_ROOT"] . "/class/$class_name.php";
}
// $_SERVER["DOCUMENT_ROOT"] 当前运行脚本所在的文档根目录
- 可以通过类名,来推导出类所在的文件名!
- 如果一个项目存在多个自动加载函数时,定义一个可以完成加载的普通函数,并在函数之前使用spl_autoload_register注册该函数。
# spl_autoload_register
- 注册__autoload()函数
bool spl_autoload_register ([ callback $autoload_function ] )
- 可以注册多个自动加载函数,先注册的先执行
- 一旦注册自动加载函数,__autoload就失效。
- 注册函数时,参数为函数名(注意加引号);注册方法时,参数为数组
# 注册类或对象的方法为自动加载方法时,参数需为数组:
spl_autoload_register(array(__CLASS__, '__autoload'));
__CLASS__表示当前类名,若是对象可用$this,详细见手册
2.9)【魔术方法】
__construct 构造方法
__destruct 析构方法
__clone 克隆对象
__sleep 序列化对象
__wakeup 反序列化对象
__autoload 自动加载,使用类但未找到时 __toString 对象被当作字符串使用时
__invoke 当尝试以调用函数的方式调用一个对象时
2.10)【重载 overload】
指动态地"创建"类属性和方法
用户可以自由的为对象添加额外的属性,该特性就是重载。
所有的重载方法都必须被声明为public。
当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。
重载相关魔术方法的参数都不能通过引用传递。
# 属性重载
- 处理不可访问的属性
属性重载只能在对象中进行。
# 属性重载对于静态属性无效
在静态方法中,这些魔术方法将不会被调用。所以这些方法都不能被声明为static。
__set 在给不可访问的属性赋值时
public void __set(string $name, mixed $value)
作用:批量管理私有属性,间接保护对象结构
__get 读取不可访问的属性的值时
public mixed __get(string $name)
__isset 当对不可访问的属性调用isset()或empty()时
public bool __isset(string $name)
__unset 当对不可访问的属性调用unset()时
public void __unset(string $name)
# 方法重载
- 处理不可访问的方法
__call 当调用一个不可访问的非静态方法(如未定义,或者不可见)时自动被调用
public mixed __call(string $name, array $arguments)
__callStatic 当在调用一个不可访问的静态方法(如未定义,或者不可见)时自动被调用
public static mixed __callStatic(string $name, array $arguments)
# $name参数是要调用的方法名称。$arguments参数是一个数组,包含着要传递给方法的参数。
2.11)【类与对象相关函数】
class_alias([$original [,$alias]]) 给类取别名
class_exists($class [,$autoload]) 检查类是否已定义
interface_exists($interface [,$autoload]) 检查接口是否已被定义
method_exists($obj, $method)检查类的方法是否存在
property_exists($class, $property) 检查对象或类是否具有该属性
get_declared_classes(void) 返回由已定义类的名字所组成的数组
get_declared_interfaces(void) 返回一个数组包含所有已声明的接口
get_class([$obj]) 返回对象的类名
get_parent_class([$obj]) 返回对象或类的父类名
get_class_methods($class) 返回由类的方法名组成的数组
get_object_vars($obj) 返回由对象属性组成的关联数组
get_class_vars($class) 返回由类的默认属性组成的数组
is_a($obj, $class) 如果对象属于该类或该类是此对象的父类则返回TRUE
is_subclass_of($obj, $class) 如果此对象是该类的子类,则返回TRUE
get_object_vars($obj) 返回由对象属性组成的关联数组
2.12)【调试技巧】
-- 使用 debug_print_backtrace()函数可以打印出程序的调用栈
-- Xdebug也是一个不错的调试工具
【精粹系列】PHP精粹的更多相关文章
- 谢孟军:The State of Go | ECUG Con 精粹系列
本月 17 日,Go 1.8 版本火热发布.相较于以往的版本,Go 1.8 具体有哪些新的特性呢?想必这是不少 Gopher 们热切关注和讨论的问题.作为著名的Golang 布道者,Gopher Ch ...
- 【精粹系列】Mysql精粹
关于Mysql整理的需要记忆和熟练掌握的内容 1.查询数据表的信息(比如有多少行数据): show table status like 'tab_User' -- 数据表中的数量 2. 使用 ex ...
- js 继承inheritance/extends
主要就是<javascript语言精粹>语言精粹中的内容 5.1伪类 Function.prototype.method = function(name,func){ this.proto ...
- OO课程的完结,软件工程学习的开始
目录 UML小结 阅读学习 大象:Thinking in UML UML精粹 UML和模式应用 本单元作业的架构设计 四个单元中架构设计及OO方法的演进 四个单元中测试与实践的演进 课程收获 三个具体 ...
- 《NoSQL精粹》思维导图读书笔记
<NoSQL精粹>思维导图读书笔记 各主题笔记 这本书短小精悍,虽不能解答所有NoSQL疑问,但在读书过程中会抛给你不少未曾想过的问题,给人以更深入的思考: 这里对每一个主题分别做了笔记: ...
- 读《javascript语法精粹》知识点总结
昨天泡了大半天的读书馆,一口气看完了<javascript语法精粹>这本书,总体来说这本书还是写的不错,难怪那么多的推荐.<javascript语法精粹>主要是归纳与总结了ja ...
- [置顶] CSS语言精粹
本文主要是对CSS中一些比较重要的高级部分作了一些整理,这些内容也许不是经常使用,但是都很强大.本文将长期更新. 边框 CSS2.1 规定:元素的背景是内容.内边距和边框区的背景.设置背景颜色时是没有 ...
- JavaScript 语言精粹笔记3
方法 毒瘤 糟粕 记录一下阅读蝴蝶书的笔记,本篇为书中最后一部分:方法.代码风格.优美的特性.毒瘤.糟粕等. 方法 这一章主要介绍了一些方法集.这里写几个我不太熟悉的方法和要点吧. array.joi ...
- 《JavaScript语言精粹》小记
一.前言 以下内容均摘自<JavaScript语言精粹>一书,本人在读这本书时,发现作者诠释JavaScript很犀利,特别是数组部分,固记录下来,想和大家分享下. 随笔主要包含两大部分: ...
随机推荐
- Android学习第二天-android常用命令
上一篇文章中,我们重点讲解了adb的常用命令,下面我们一起来看看其它常用的命令 2 android 2.1 查看机器上所有已经安装的Android版本和AVD设备 2.1.1查看机器上已经安装的AVD ...
- 如何在 ASP.NET MVC 中集成 AngularJS(2)
在如何在 ASP.NET MVC 中集成 AngularJS(1)中,我们介绍了 ASP.NET MVC 捆绑和压缩.应用程序版本自动刷新和工程构建等内容. 下面介绍如何在 ASP.NET MVC 中 ...
- 可扩容分布式session方案
分布式session有以下几种方案: 1. 基于nfs(net filesystem)的session共享 将共享服务器目录mount各服务器的本地session目录,session读写受共享服务器i ...
- [CORS:跨域资源共享] 同源策略与JSONP
Web API普遍采用面向资源的REST架构,将浏览器最终执行上下文的JavaScript应用Web API消费者的重要组成部分."同源策略"限制了JavaScript的跨站点调用 ...
- jquery做一些小的特效
在文本框里输入内容到添加到下拉列表里,移除下拉里的内容 1 <!DOCTYPE html> <html> <head> <meta charset=" ...
- atom-shell程序打包
上一篇:http://www.cnblogs.com/luobenCode/p/4504910.html 打包之前要准备一下 请看这篇http://www.cnblogs.com/seanlv/arc ...
- js array queue (队列)
前言 今天项目中做一个图片效果展示,需要实时从后台获取图片数据,前段做展示.想想用到队列,比较好实现这个功能,只需要展示队列里的数据就可以了.于是写了个js 对列. js code /** * [Qu ...
- GitHub的使用记录
前言: 该贴为笔者在使用GItHub中的一些使用注意,及Git的基本命令,会一直记录笔者在使用GitHub中可能产生的错误及解决方法(会一直更新中),待一些Git初使用者参考,如果有说明不详细或不对的 ...
- SQL语句全
创建数据库 创建之前判断该数据库是否存在 if exists (select * from sysdatabases where name='databaseName') drop database ...
- Entity Framework 6 Code First新特性:支持存储过程
Entity Framework 6提供支持存储过程的新特性,本文具体演示Entity Framework 6 Code First的存储过程操作. Code First的插入/修改/删除存储过程 默 ...