关于在php中变量少写了一个$和页面不断转圈的问题排查

php中的所有变量都是页面级的, 即任何一个页面, 最多 都只能在一个文件 : 当前页面内使用, 不存在跨 文件/ 跨页面的 作用域的变量!
因此, 即使是 $GLOBALS 这个变量, 虽然叫全局 变量, 但是它也是页面级的, 在一个页面内保存的 "全局变量 , " 并不能 带到 其他页面内使用
!!! 这一点 跟java, C ++ 等语言是不同的

local: 有两个含义: 一个是 "本地的, 当地的", 另一个还有: "局部的, 只在本函数内使用的, 不能出函数的"

页面级的 全局变量:

  • 所谓的全局变量, 是 相对于 函数内的 "局部/ 本地" 变量而言的: 就是 一个页面内, 凡是 在 函数外部定义的 变量, 就叫 全局变量. 它的作用域: 从 定义该变量起到 文件结尾.
  • 全局变量 从定义开始, 可以在 脚本中的任意地方使用 (除函数内).
  • 要在 函数内使用全局变量, 有两种方法 一是使用 形容词/限定词: global $all; 而是 使用 特殊变量 (叫 超全局变量! ): $GLOBALS['somevar']
  • 要注意的是, 当使用 global或 $GLOBALS后, 就是使用的 该全局变量本身, 不是使用的 拷贝, 是改变的该全局变量本身, 相当于传递的是一个 全局变量的地址!
  • 注意 $GLOBALS的写法: 不是$_GLOBALS , 没有 下划线, 而且必须有s

    php的代码 必须以分号结束, 即使在 if...else语句中, 的大括号里面 只有一条语句, 也要用 分号结束! 否则会报错: 意外的 }, 需要 分号或逗号

================================

关于php中的 字面 字符串!

  • 首先, 通常, php中的字符串是要用 引号括起来的, 但是, 有时候, 如果 你在 php中 忘了写 单引号 或 双引号, 那么 一个字符序列(单词) 仍然会被 看作是一个字符串!
  • 你可以通过 php的 gettype(foo); gettype 函数 来 查看 任何结果的 类型! 比如: echo gettype(foo>1); 此时返回的是一个 boolean.

  • 也就是说, 在php中 一个 没有 加引号的 字符序列是 被允许的! 是被当作一个 "字符串"字面 常量来对待的. 而且还不会被 报错!!! 这一点 真的是很害人的! 如果不注意, 会引起很多很严重的问题的
  • 所以, 如果在 写变量的时候, 如果保持java, c, c++, js等语言的习惯, 忘了写$, 那么这个时候, php不会报错! 而且会把它作为一个 "字面"字符串来对待! 而这时候, 如果恰恰又在 循环语句中, 用来 控制 循环结束条件时, 比如写成 for(i=0; i<count($ret); i++) , 那么在该循环条件中, 由于 i是 一个"字面字符串", 而且是合法的,不报错! i<count($ret) 将被 作为: "字符串和数字比较" , 参考下面的内容, 其结果 将是一个始终为true的 条件, 这样 将会陷入 "死循环"

关于 字符串和数字 进行比较的 方法, 参考: http://www.cnblogs.com/youxin/p/3873397.html

  • 字符和字符比较, 字符串和字符串比较, 按常规方法, 但是 如果是 字符串和 数字比较则要注意了!
  • 字符/字符串 和数字 比较, 就不是 比较 字符从Ascii码了, 而是: 首先 "试图/尝试" 着将 字符串 转换为数字, 然后按数字大小进行比较; 其次, 如果 该字符串不能转换为数字, 即 "如果是 无法转换为数字"的字符串 , 则 把该字符串(包括字面字符串) 当作数字0 来进行比较!

========================================

页面 不断 转圈的问题!

  • 如果是本地 服务器(进行localhost进行测试的时候) 页面一直转圈, 那么就只有一种 可能, 而且一定是这个原因: "页面 陷入了 死循环! "
  • 因为, 如果是页面由于 语法错误, 那么它会 报错的!
  • 如果不报错, 又不是因为在生产环境下, 不存在远程服务器 的网络传输问题,
  • 所以, 在本地服务器机器上, 页面一直转圈! 那么就 不可能是因为页面 执行某些代码时间 太长的原因! 那一定是 因为 页面 逻辑错误! 不报错! , 页面的某些代码 : 一定是 陷入了 死循环! 所以 一直执行不完, 一直执行, cpu负荷很高, 所以 死循环导致 页面一直转圈!

===================

php的变量不需要 事先定义声明的?

php的底层C是由一个联合体union来存储变量,这个联合体里面有各种变量类型,php都以long类型来存储整型,用hashtable哈西表来存储数组,因为union可以存储各种变量,并且解释器会自动判定变量类型,所以php不用声明变量类型,弱类型
php是弱类型,也即动态语言,在运行时才确定变量的类型。

特别注意的是: php的变量类型 是没有 undefined! 这一点 不像 javascript! 对于 所谓的 未定义的变量, 其类型是 Null , 不是 undefined , 因为 根本就没有 undefined的数据类型 , 即使"所谓的未定义" 变量, 其类型 也是 null 因为 php的变量 事先 并不需要 定义!!!! 8种数据类型是: boolean, integer, float(也叫double), string, array, boject, null , resource

参考: http://www.cnblogs.com/leokou/archive/2011/06/01/2067144.html

猜你喜欢

转载自www.cnblogs.com/bkylee/p/10805686.html