点击关注微信公众号 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也是一个不错的调试工具