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

    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=' 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多行模式, 这样就一样的用 分号来 结束语句了.

  • 相关阅读:
    SCI写作经典替换词,瞬间高大上!(转)
    最佳化常用测试函数 Optimization Test functions
    算法复杂度速查表
    VS 代码行统计
    CPLEX IDE 菜单栏语言设置( 中文 英文 韩文 等多国语言 设置)
    如何从PDF文件中提取矢量图
    Matlab无法打开M文件的错误( Undefined function or method 'uiopen' for input arguments of type 'char)
    visual studio 资源视图 空白 解决方案
    MFC DialogBar 按钮灰色不响应
    嗨翻C语言笔记(二)
  • 原文地址:https://www.cnblogs.com/bkylee/p/10805686.html
Copyright © 2011-2022 走看看