关于在php中变量少写了一个$和页面不断转圈的问题排查和vim的自动补全方式

时间:2021-01-21 21:32:19

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

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

杂项

= dialog的内容content/href并不是必须的选项 其内容可以在 dialog调用 显示方法之前, 调用其他方法来生成, 填充dialog的内容(比如: $('#dialog').html(..), .append(...)等方法.

== 如果是 使用conent: iframe的话, 这个 iframe标签中, 是不能直接写html代码的, 只能 用src属性 来指定 内容源.只是要设置 一些其他属性,比如 frameborder等:

content: "<iframe scrolling='auto' frameborder='0' src='foo.html' style='width: 100%; height: 100% ;display:block;' ></iframe>"

上面的这个 content: iframe是最常用的, 也是 适用于绝大多数情况下的写法.

然后再用 $("#diag").dialog('open');

=== 使用 这种iframe的方式时, 在html代码的div 中, 必须给 div 写上 easyui-dialog的类属性, 否则会出很多报错. 也就是说 在 iframe锁指定的 源 html/php文件中 , 其div必须是一个 easyui的dialog, 即 div必须有 class="easy-dialog"这个类属性.

== 回调函数: callback: 简写成cb, 是说 发起异步请求时, cb函数 处理的时间 是不确定的!

关于 异步操作, 最直接的感受是: 你不知道异步操作什么时候完成, 也没有办法直接获取到异步操作的结果. 因为 当函数A 在 "异步" 调用 函数B 的时候, 函数A 不等B 返回结果 , 立即顺序执行 后面的语句, 直至函数A 退出结束. 也就是说, 如果 你用 js调试跟踪函数A 的执行时, 调试器是 不会进到 函数 B 的内部去的!!

=== $.ajax 的{..., "async": false,....} 操作默认的是 异步的 , async的属性总是true, 但是 如果你要 后续操作 要等到 请求完成后才能进行, 即需要锁死浏览器, 就可以设置 : async: false, 此时, 所有的操作就变成 同步的了. 但是要注意 浏览器 锁死的问题

由此可见, 计算机中的所谓 "同步" , "异步"操作, 实际上就是 一个 "串行,并行"的问题, 同步是指 在一系列的操作步骤a -> b -> c ...中, 操作是依次进行的, 只有当a步骤完成后, 才能执行 b步骤... , 相当于 串行, 电流的串联电路一样.... 同步操作中, 就存在 所谓的 "等待/延迟/ 锁死" 问题. 而 异步就是所谓的 "并行" , 类似于 " 并联电路" , 电流可以分多个支路同时进行. 在一些列操作中 a, b, c,d... 步骤b 可以在执行 a的 或 同时/ 或 之后 或之前 进行, 步骤b跟步骤a的执行 先后时间/顺序 关系不大.

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

关于vim的自动提示和补全?

  • vim自动补全的插件有很多, 包括: youcompleteme(ycm), autoComplete, omniCppComplete, snipmate, completor, omni-complete, omnifunctionComplete.等等

    但是 从 vim7.1后, vim就自带了 自动补全和提示了, 所以可以直接使用其原生的 提示和补全, 而不用安装其他外来的插件了。

    自动补全的原理就是:

    将起始字符(或多个起始字符) 相同的单词, 搜索查找出来, 放在xml或text 临时缓存起来, 然后将这些内容再显示在 提示框中。

    很多都 依赖于python组件。

  • vim自带的补全和提示:

    提示待选框 的位置, 可能在当前提示行的上方, 也可能在当前位置的下方

    提示待选框中的内容,上一次被选择的 内容项总是出现在 待选框的 最下面那一个, 然后你可以用 ctrl+p向上移动, 用 ctrl+N向下移动,全部完了之后就显示 “回到起点”

    vim的状态栏上, 还有 待选模式/ 待选项目 当前待选项的 各种完整的提示

    待选项可以 直接上屏, 当得到待选项后, (如何知道当前是哪个待选项? 直接看上屏的是哪个内容的选项? )可以直接 写后面接着的 各种代码内容。

  • 如果 只是直接补全 单词, 可以直接使用 (在insert模式下) ctrl+p, 或 ctrl+N (注意n是next, 既然是next向下, 所以它初始化选中的就是第一个待选项, 如果是ctrl+p是向上,所以默认初始化选中的就是最后一个)

    但是 如果要补全 其他 内容, 比如要补全 整行, 就要使用 ctrl+x( 然后有很多子模式), 比如:^]: 表示tag标签, ^D 表示define常量, ^L表示补全整行。。。

1. 单词自动补全:
CTRL+n :当你输入第一个字母的时候,再CTRL+n,自动出现下拉菜单,单词默认选中第一个,继续CTRL+n,CTRL+p可以上下切换,或者用方向键(太慢)
CTRL+p :同上,只是默认的选中的是列表中最后一个单词
行自动补全: CTRL+x CTRL+l (l指小写的L ):两个命令组合使用。在插入模式下输入已经存在行的第一个单词,再按这两个键,就会列出该整行出来
文件名自动补全: CTRL+x CTRL+f :插入模式下,按这两个组合键,可以插入当前目录下的文件名。处用在哪里呢,当然是有时候我们要指定默认执行文件的路径,这样就方便啦。
字典补全: 首先在~/.vimrc加入如下代码,注意这是在Linux,windows下应该是C:\Users\$username(用户名) set dictionary-=$VIM/dic.txt dictionary+=$VIM/dic.txt dic.txt中的单词一每行一个单词来分割的
CTRL+x CTRL+k 就能看到dic.txt中定义的单词的,如果你还麻烦,想直接CTRL+n就显示其中的列表的话,再配置一下.vimrc文件: set complete-=k complete+=k

======

有一个很重要的vim插件: supertab.vmb, 他不改变vim自带的补全功能, 而且可以和 vim自带的补全方式 无缝配合: 在没有补全可能(提示)的情况下, 你仍然可以正常地使用tab。而且 如果是 “单词补全” 在只有一种可能的情况下, 直接就给你不好了, 类似于(shell的自动补全功能)。 如果有多种补全可能, 就弹出vim的补全菜单下拉框。

install details:

  1. download supertab.vmb to any directory.
  2. open the file in vim: (命令:vim supertab.vmb)
  3. source the file: (命令: :so %)

    关于 %的用法:在命令行模式下:

    %: 表示完整的包括路径的 文件全部名称

    %:h 表示文件的头部部分, 即文件的路径;

    %:t 表示文件的尾部部分, 即没有路径的文件名

    %:r 表示t去掉扩展名的意思

    %:e 表示文件的扩展名。

omni: 全, 全部, omni-Complete: 全能补全,

参考: https://segmentfault.com/q/1010000004713445

插件地址:https://www.vim.org/scripts/script.php?script_id=1643
下载后,把它放到.vim/plugin目录就可以了。 可以对下面两个选项进行配置,以调整SuperTab的缺省行为: g:SuperTabRetainCompletionType的值缺省为1,意为记住你上次的补全方式,直到使用其它的补全命令改变它;如果把它设成2,意味着记住上次的补全方式,直到按ESC退出插入模式为止;如果设为0,意味着不记录上次的补全方式。
g:SuperTabDefaultCompletionType的值设置缺省的补全方式,缺省为CTRL-P。
你可以在vimrc中设置这两个变量,例如: let g:SuperTabRetainCompletionType = 2
let g:SuperTabDefaultCompletionType = "<C-X><C-O>"

当出现了补全列表选项框后, 要如何操作这个选项框呢?

参考: https://www.cnblogs.com/zhangshuli-1989/p/hq_15_12_18_00_10.html 其中有: ctrl+ y, e, h, l, +字符的含义。

ctrl+n 或ctrl+x ctrl+o是 表示 全能补全 : omni - 补全。

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

vim会根据上下文参数决定使用哪个命令, 所以 虽然 以so开头 的命令有多个, 但是如果用 so somesavehistory.vim则会执行这个vim脚本文件, 就等于: source foo.vim

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

在linux下使用 mycli?

  • 实际上, 在 fedora22中, 安装了 mariadb10.0 后, 就已经自动安装了 mycli了. 不需要 再额外 安装 mycli了!

  • mycli需要 python, pygments等的支持, 在 windows中有些问题?

  • mysql的配置文件中, /etc/my.cnf 要单独的 另外创建一个 节 配置auto-rehash: [mysql] auto-rehash 也可以实现 mysql的自动补全和auto-completion.

    但是 , mysql 的自动补全没有 语法 高亮, 也不能 对 关键字进行提示和自动补全.

  • 要实现 完整的/全面的功能, 还是要使用 mycli. 在 ~/.myclirc 配置文件中, 设置...

mycli是以 回车结束语句的, 而mysql是以分号 结束语句的. 所以mycli 要用 exit来退出, 而不能用 exit; 来退出~ 除非设置多行模式: multi_line=True.

  • 刚开始 , 可能有点 不习惯 mycli, 可以和 mysql两个 交替使用. 或者, 设置mycli为 multiple-line多行模式, 这样就一样的用 分号来 结束语句了.