PHP开发经验总结

请说明 PHP 中传值与传引用的区别。什么时候传值什么时候传引用?

  1. 按值传递:函数范围内对值的任何改变在函数外部都会被忽略
  2. 按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改
  3. 优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。

js闭包,原型链是什么?

  1. 闭包是指有权访问另一个函数作用域中的变量的函数
  2. 派生对象使用proto指针保存对原型对象的链接,就形成了原型链。对象通过原型链相互连接。所有的对象都在原型链上。所有的原型链顶端都是Object对象。

php中for和foreach比较

  1. php推荐用foreach。
  2. for需要事先count(arr)计算数组长度,需要引入自增变量i,每次循环都要进行条件判断i<c,然后自增i++,输出数组元素时,arr[$i]需要进行哈希操作.
  3. foreach循环数组时,指针会自动指向下一个元素,不需要计算数组长度,没有条件判断和自增变量,调用元素时也没有哈希操作

mysql与mysqli的区别

  1. mysql连接:每当第二次使用的时候,都会重新打开一个新的进程。
  2. mysqli连接:一直都只使用同一个进程。

php7和PHP5对比的新特性和性能优化

  1. 抽象语法树(AST): AST在PHP编译过程作为一个中间件的角色,替换原来直接从解释器吐出opcode的方式,让解释器(parser)和编译器(compliler)解耦,可以减少一些Hack代码,同时,让实现更容易理解和可维护
  2. Natice TLS:线程数据共享安全,开启一个全局线程用作数据共享内存空间
  3. 指定参数 返回值类型
  4. zval 结构的变化
  5. 异常处理
  6. 新的参数解析方式
  7. hashtable变化

防止SQL注入

  1. 打开php的安全模式同时关闭用户组安全:safe_mode=On------safe_mode_gid = off
  2. 控制php脚本能访问的目录,设置为自己的网站更目录:open_basedir = D:/usr/www
  3. 关闭危险函数:display_function=
  4. 关闭PHP版本信息在http头中的泄漏:expose_php = Off
  5. 关闭注册全局变量:register_globals = Off(默认关闭)
  6. MYSQL的降权运行
  7. 使用mysql_real_escape_string函数对参数过滤

预防XSS攻击

  1. 过滤从表单提交来的数据,使用php过滤函数htmlentities()中文一起转化,htmlspecialchars()不会转化中文默认情况下不处理单引号,最好加上第二个参数ENT_QUOTES
  2. 打开session.cookie_httponly
  3. 扩展remove_xss方法正则过滤

预防CSRF攻击

  1. 在php.ini中设置禁用allow_url_fopen和allow_url_include
  2. 生成另一个一次性的令牌并将其嵌入表单,保存在会话中(一个会话变量),在提交时检查它

PHP垃圾回收机制

PHP可以自动进行内存管理,清除不再需要的对象。PHP使用了引用计数(referencecounting)这种单纯的垃圾回收(garbagecollection)机制。每个对象都内含一个引用计数器,每个reference连接到对象,计数器加1。当reference离开生存空间或被设为NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间。

双引号和单引号的区别

  1. 双引号解释变量,单引号不解释变量
  2. 双引号里插入单引号,其中单引号里如果有变量的话,变量解释
  3. 双引号的变量名后面必须要有一个非数字、字母、下划线的特殊字符,或者用{}讲变量括起来,否则会将变量名后面的部分当做一个整体,引起语法错误
  4. 双引号解释转义字符,单引号不解释转义字符,但是解释'\和\
  5. 能使单引号字符尽量使用单引号,单引号的效率比双引号要高(因为双引号要先遍历一遍,判断里面有没有变量,然后再进行操作,而单引号则不需要判断)

获取MySQL InnoDB索引树的高度

SELECT
b.name, a.name, index_id, type, a.space, a.PAGE_NO
FROM
information_schema.INNODB_SYS_INDEXES a,
information_schema.INNODB_SYS_TABLES b
WHERE
a.table_id = b.table_id AND a.space <> 0;

isset、empty、is_null的区别

  1. isset 判断变量是否定义或者是否为空
  2. empty:判断变量的值是否为空,能转换为false的都是空,为空返回true,反之返回false。
  3. is_null:检测传入的值(值、变量、表达式)是否为null
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容