zoukankan      html  css  js  c++  java
  • tp框架中的一些疑点知识-5

    关于vim中的缓存区的前后bp和bn的界定

    • 通过命令ls可以看到 缓存区的 排序. 最开始打开的文件排在最上面, 序号最小. 那么它们就是 更 的缓冲区.
    • 序号更前的用bp, 序号靠后的用bn. 但是 序号的数字不一定是挨着的
    • 你自己也可以 根据打开文件的先后次序来判定 p和n, 如果打开当前文件后, 再打开第二个文件, 那么第二个文件就是 后next文件, 当前文件就是previous文件. 所以 , 在第二个文件编辑的时候, 要回到当前文件, 就要用 bp..

    关于路由?

    • 首先要明确, 使用路由访问某个页面时, 他的url地址的写法: 由于路由总是只能在 模块内进行路由(不能跨模块路由, 不能省略 模块名称), 所以, 使用路由进行访问时, url地址中的 路由表达式 总是放在 模块名称后面的: 比如: http://serverName/index.php/Home/ (这里才是路由表达式) 或者伪静态的url访问地址是: http://servername/Home/(路由表达式放这里) 而不是直接放在 servername后, 比如: localhost/index.php/路由表达式 localhost/路由表达式 这两个都是错误的, 访问不到的!

    • 其次, 是 路由地址, 分为内部地址和外部地址(闭包函数另算).

    1. 内部地址的 格式: 总是 [模块名可以省略]/控制器名称/操作名称 (也就是说一定要是控制器/操作名称, 而不是随意写的)

    参数的方式有 三种: 一种是参数都作为字符串放在路由地址后面: [home/]About/contact?var1=value1&var2=value2.. ?问号前面通常不要斜杠
    或者把 路由地址, 附加参数, 控制参数比如 array('ext'=>'html') 三者放在数组中也是可以的

    2.外部地址的格式: 就是比较随意的了, 不需要用 控制器,操作来说明的了, 可以直接用 根路径/或 全局http:// 路径了.

    外部地址同样 可以用数组, 来指明 外部地址, 重定向代码301或302等, 附加参数等

    在NERDTree中, 'Tree Filtering Mappings' 是控制隐藏文件(点号开头文件)的 / 普通文件/书签的 "开/关键", 而且都是大写的单子母, 有 I(隐藏文件开关), F(普通文件显式和隐藏开关), B(书签显式和隐藏的开关).

    定义vim在插入模式下, 的向左或向右的快捷键, 不要用 ll了, 因为很多单词, 特别是定义控制器的controller 中包含ll, 很容易受干扰 所以 可以定义为 "zz, yy"即左左右右. 这个很少有单词会这样的了, 就像用jj,kk表示上下移动一样.

    在linux下, 即使 URL_MODEL的值为1, 即为pathinfo模式, 不是 rewrite模式 2, 只要html根目录下, 存在.htaccess文件(文件名必须是这个, 不能改名), 而且里面的 RewriteRule ^(.*)$ index.php/$1 [QSA, PT,L]的话, 就能够 实现伪静态,(隐藏index.php入口文件). 这个.htaccess伪静态, 对路由也是适用的!


    markdown中的引用?

    • 是采用的email形式的 引用, 使用 大于符号 > 来表示的- 当然 大于符号必须顶格写, 而且与后面的内容之间要有至少一个空格 , 注意这个顶格的意思还包括: 就是 大于符号 不能 有缩进, 也就是必须放在 当前行的 第一列! 否则如果大于符号不在第一列, 就不认为是引用, 而是 普通字符了.

    • 引用可以嵌套 > >

    • 格式注意: 因为是 blockquotes 区块引用, 所以 即使是中间 包含空行, 这个空行的行首, 也要用 大于符号, 否则区块引用就断开了. 引用 区块 断开, 是什么意思呢 ? 就是说, 引用的内容将成为 两个 引用部分. 这两个引用 区块 将是独立的, 不相关的了.

    • 因此, 如果想 所有的 内容 都放在一个 引用 区块blockquotes内, 就要求: 每一行(包括空行都要用 大于符号), 或者 在一个段落的 开头用 大于符号. 或者 你可以自己先 断好行. 都行

    • 引用内, 也可以使用 字号, 列表等, 但要注意, 这些 字号/列表等表示符号也必须要顶格写, 就是 离前面的 大于符号必须只能有 一个 空格. 多一个空格都不行, 都无效!

    • markdown中的$ 符号没有什么特殊含义?!


    1. 关于扩展标签库的使用
      标签库的作用是, 简化php模板和html代码 混着写的麻烦. 而实际上 在Runtime/Cache/Home/缓存文件.php中还是会转化为php代码...

    tp中的标签库要用严格的xml语法;
    闭合标签是指有完整的开始标签和结束标签(关闭/闭合标签). 而开放(非闭合标签)标签是指以 / 结束的没 有另外的结束标签

    系统自带的 内置标签库的位置在: ThinkTemplateTagLib下, 包括Cx.class.php和 Html.class.php两个标签库文件.
    自定义扩展标签库是放在 ./Application/Home/TagLib/ 目录中, TagLib目录需要自己创建.

    标签库文件的命名: 没有特殊要求, 推荐按规范命名: TagLibMy.class.php, 或者 MyTagLib.class.php. 或者参照内置的标签库命名为:

    My.class.php 都可以.(自定义的标签库, 可以用在自己想要实现的一些功能上.)

    继承自: ThinkTemplateTagLib.class.php文件类.
    标签需要定义的属性包括: attr, close, level(嵌套级数)...
    标签的实现:

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

    null和 空字符串 的区别, 前者表示 "真的没有", 未曾发生过, 根本就没有这回事! "黑洞". 而空串是有内容的,至少有结束标志符"" 的.

    所以, 判断 $arr['a'] => null; if(isset($arr['a'])) 将是false. 而如果$arr['a'] = '', 则判断isset则为true.

    isset和empty函数的区别?

    • isset是判断数组的某个索引下标 是否设置了的, (如果下标本来就没有设置, 或者 设置为null, 那么isset就是false.)
    • 而empty是判断数组成员是否为空.

    对 $arr['a'] ='', 0, false来说, isset是设置了的, 返回true, 而empty则为空, 也返回true.

    内置标签库叫做: Cx: 意思是core xml标签库?

    volist标签中的 name和 id的意思? visualization of list. id: item-data 每一项的数据.


    标签的属性项目?

    按常规的做法: 通常标签中, 都有 name属性: 表示你要处理的变量名. 一般还有value, item或者id等.
    标签本身的写法中, 总是只有属性的, 而且属性值中的name 属性通常 是不能带 $的(正跟html标签的用法完全是一样的. 你看html标签中带

    不带$符号呢? ). 否则就又是hp了. 但是在 value属性中, 可以使用 带$ 符号的变量名.

    但是, 在标签的内容(标签体)中, 如果要输出变量的值, 还是要用 {$id.username} 等方式来输出.

    -----====================

    扩展标签库(自定义)的定义和使用

    1. 创建扩展标签库类文件
    <?php
    namespace HomeTagLib; // home是默认的根命名空间
    use ThinkTemplateTagLib;
    
    class My extends TagLib{
    	protected $tags = array(
    		'space' => array('attr' => 'count',  'close' => 0, 'level' =>1 ),
    		);
    
    	public function _space($tag){
    		$parseStr = "<?php echo  '";   // 注意这里要加单引号, 否则会报错 因为解析后的就是 echo <br><br> ;自然就有语法错误.
    		$count=$tag['count'];
    		if ($count<1) return;
    		for($i=0; $i<$count; $i++){
    			$parseStr.='&nbsp;';
    		}
    		$parseStr.="';  ?>";
    
    		return $parseStr;    // 通常标签返回的都是一个 $parseStr 字符串.
    	}
    }
    
    1. 使用标签库
    首先要引入标签库:
    <taglib name="my" />   如果直接写, 会提示错误: "实例化一个不存在的类!:ThinkTemplateTagLibMy" 就是说, 如果不写路径, 会默认在系统内置的标签库存放目录 : TemplateTagLib目录中寻找...
    
    <taglib name="HomeTagLibmy" />  而且要严格对应类的大小写: 报错:  "实例化一个不存在的类!:HomeTagLibmy" 要用 <taglib name="HomeTagLibMy" />
    
    其次, 在使用自定义标签的时候, 要用 <my:space count="3" /> 这样的形式.
    
    3, 为了简化上面的操作 可以定义: 'TAGLIB_PRE_LOAD' => 'My', 'TAGLIB_BUILD_IN' =>	'Cx, My', 
    
    

    要创建自己的标签(库), 最简单的方法, 就是将自定义标签放到 系统内置的表情库中.. ThinkTemplateTagLibCx.class

    但是为了 便于移植, 建议不要修改系统 原来的框架, 而是将 自定义的内容, 放到 应用模块配置中.


    tp中类的加载?

    • tp框架在实例化一个类的时候, 首先要知道这个类在哪里,tp要到哪里去找这个类,知道这个类的位置。这个工作就是自动加载。如果一个类不能找到,tp不能加载的话就会报错。
      自动加载 就是指在代码中 实例化一个类对象的时候,可以直接用new方法, 而不去管这个类的定义文件在哪里。

    • 总的来说, 分为 两种方式: 自动加载 和 import手动加载;

    • 自动加载有三种方法: Library子目录, 自定义‘autoload_namespace', 创建类库映射alias.php文件中

    3种自动加载的手段:

    1. 是在ThinkPHP/Library目录下的 子目录都会被系统自动加载,所以, LibrayThink, LibrayOrg等中的类库都可以自动加载;
    2. 是自定义自动加载的命名空间: 通过在模块配置文件中, 加入: 'AUTOLOAD_NAMESPACE' => array(...);
    3. 定义类库映射


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

    ### 四种加载类的方法中, 前面两种自动加载,必须要求 第一, 类库文件的命名要符合tp的命名规范,文件名必须以 .class.php结尾; 第二, 在声明/定义类的时候, 一定要用 namespace语句(声明命名空间)。而类库映射和imprt则不需要这些限制。

    不要犯低级错误: 书写错误, 写错关键字, 写错类名等, 这就要留意编辑器的 颜色高亮提示...

    return array(  // 在Home/Conf/config.php文件中配置根命名空间
    
    	'AUTOLOAD_NAMESPACE' => array(        // 这里要注意, autoload_namespace一定要用数组, 一方面表示可以配置多个根namespace
    		'Common' => COMMON_PATH,      // 另一方面,要用前面的 索引名称 来表示 根命名空间的名称 , 后面是真实的路径, 比如这里的Common是根命名空间,
    
    	),
    
    );
    
    <?php  // 在前台和后台都要使用的 类, 就放在 /Application/Common目录中, 可以在Common目录下创建一个 Library目录来放类库. 这样Common目录就包括有: Common, Conf,和 Library目录了.
    
    比如:  namespace CommonLibrary; 
    
    class Person {
    	public function __construct(){
    			print  'created a person'; 
    	}
    
    }
    那么在 控制器的操作中, 使用的时候 , 就可以用 : $p = new CommonLibraryPerson(); 来实例化一个类了.
    
    

    通常在使用类/加载类的时候,情况,都是在控制器的操作方法中。当在操作方法中, 使用new 一个类对象的时候:

    1. new类名的时候, 在类路径名称前面加不加 反斜杠是 有区别的:
      • 不加反斜杠,表示的是 相对路径: 总是相对于当前模块Home的当前控制器Controller下的类;即使是 你已经定义了某个 根命名空间,如果不加反斜杠,则还是/总是在Controller控制器下: 比如: new OrgUtilTrans(), 则会认为是: HomeControllerOrgUtilTrans这个类
      • 如果加反斜杠, 表示的是 “根命名空间”,注意:不是根路径,不是指项目根目录的路径,即不是指../Application这个路径。

    因此, 如果你要实例化你 自己定义的 “根命名空间”下的类, 一定要加上这个反斜杠,表示是 根命名空间。

    1. tp中的根命名空间,是有特指的,包括两种情况:
      第一, 凡是 ThinkPHP/Library/ 目录下的 所有 单级子目录(注意仅仅只是指单级的子目录,更下一级的子目录则不是根namespace! )都是系统已 定义好了的 根命名空间, 可以直接使用;
      其次, 在模块配置文件中 Home/Conf/config.php中, 配置的 根命名空间:

    2. 在使用上,凡是要自动载入的类, 都应该从 根命名空间开始写起: 包括:
      第一, 在定义类的时候, namespace要从根namespace写起,但是不需要加反斜杠;
      第二, 在实例化类的时候, 也要从根命名空间写起,而且要在前面加反斜杠.


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

    模板注释

    • 使用{/.../} 或 {//...} 的方式, 前者可以多行注释, {和注释符之间不能有空格
    • 模板注释在缓存.php中会自动被删除.
    1. 所有不需要被模板解析的内容, 要按原样输出的, 都可以放在 literal标签中

    2. 使用 php本身就有的 流程控制 替代语法
      包括 for foreach while , if elseif switch 等几个, 用: 来代替{, 用 相应的end??? 来代替 }. 就是在写这些流程控制语句时,不用管中间

    的大括号就行了.
    这样做的目的是, 在 php和html代码混合的情况下, 更简洁. 更易懂.
    比如:

    <?php for($i=0; $i<10; $i++): ?>   // 但是要注意, 每个php语句本身还是要有 ?> 结束符
    <p>输出循环变量 <?php echo $i; ?>
    <?php endfor; ?>
    
    <?php  if($index > 10) :  ?>
    <br>index 大于10
    <?php else: ?>
    <br> index 小于等于10
    <?php endif; ?>
    
    


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

    关于php标签? 要使用原生的php语法,建议使用 php标签,因为安全问题,有时候会配置 'TMPL_DENY_PHP' => TRUE,这时候就不能使用原生的php了

    用php标签,就不能使用 模板/标签

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

    1. tp中的调试
    • 错误调试,“错误就是异常” 都用 E函数来做。E($msg): 输出错误信息并终止执行, 类似于die
    • 性能调试, 统一用G函数. G('begin')设置开始计时/统计内存消耗的起始点,G('end'), G('begin','end')返回计时,单位是秒. 即: G('begin','end').'s' 内存消耗: G('begin','end', 'm').
     * 使用方法:
     * <code>
     * G('begin'); // 记录开始标记位
     * // ... 区间运行代码
     * G('end'); // 记录结束标签位
     * echo G('begin','end',6); // 统计区间运行时间 精确到小数后6位
     * echo G('begin','end','m'); // 统计区间内存使用情况
     * 如果end标记位没有定义,则会自动以当前作为标记位
     * 其中统计内存使用需要 MEMORY_LIMIT_ON 常量为true才有效
    
    ``
    `
    
    - 模型调试 使用 $Model -> getLastSql()方法
    - Trace调试 要输出页面trace信息.  首先要开启 'SHOW_PAGE_TRACE'=>true. 然后在页面有模版输出的时候就会在页面的右下角有显示.
    
    1. 在关闭调试模式,开启 部署模式的情况下, 如果仍然想要输出错误信息 , 配置 "SHOW_ERROR_MSG =>true"
    
    1.  要想在页面的右下角输出 页面追踪信息, 只需要 配置 : `'SHOW_PAGE_TRACE' => true, `
    
    
    
    --------------
    
    ### 关于jquery的选择器
    1. parent选择器和方法
    :parent因为是过滤选择器,(内容选择器) 是对前面的元素选择器的描述和说明,所以 它 表示 的并不是元素的父节点, 而是判断选择器元素是否包含子节点. 是否不为空. 即, :parent相当于 过滤器  :not-empty  (只不过jquery并没有not-empty这样的过滤器而已, 所以就用 :parent 来表示了)    <b>与之相对应的另一个内容选择器是 :empty.</b>
    
    要真的选择父节点, 使用方法 parent. 要选择所有的祖先节点, 使用 parents方法.
    
    - 将内容加粗, 可以使用 b标签或 strong标签. 但是他们的语义不同: b 的语义表示它只是一种格式. strong带有强调的语义.
    
    - jquery的很多函数,可以使用 闭包(匿名函数)做参数, 目的是: 为了满足设置的 可变化性, 而不是固定写死. 其中返回值就是用来设置的参数.
    
    
    -  wrap和unwrap的功能还是很实用的. 要在对象的 外面包裹一个标签, 或移除一个标签就用 wrap或 unwrap.
    wrap的时候, 标签可以只写开始标签, 而不写结束标签. 比如可以写 `<p></p>`, 也可以只写`<p>`
    标签中可以包含其他信息, 比如class, id等. 比如: `<p class="foo">`什么的.
    
    - 很多时候, 不管是函数的参数, 还是什么, 都需要用 字符串拼接, 以及 字符串拼接变量.
    
    2. 在js, jquery中, 凡是形如key:‘value'这样的, 一定是一个js的对象, 而不会是参数, 因为没有哪个参数的格式会是这样的, 所以, 既然是js对象, 在写法上都应该给它加上大括号。比如 $.ajax, $.get等方法里面的传递数据.
    
    
    3. ajax真的其实很简单, 就是向远程服务器上的页面文件传递数据参数, 然后接收从服务器(经过处理后)传递回来的数据, 最后在当前的html页面的某个div或标签中显示.
    
    4. jquery中, 选择同辈元素, 有两种方式: 一是使用过滤器(只有 加号 +和 ~符号, 前者只能表示当前元素后面
    的元素, ~则表示前后所有的同辈) , 另一种是使用 筛选函数中的查找函数, 比如next, nextAll, prev,prevAll就可以找到之前的同辈元素了.
    <font color="green"> 要注意 同辈元素的选择, 并不包括自己,不包括当前元素! </font>
    
    5. <font color="red"> 要特别注意, jquery中的 同辈选择器和同辈函数的不同: 前者 不管是 + 还是 ~  都只能是从当前元素 **向后** 选择的, 即使是 :siblings (也只会选择从当前元素 **之后** 的所有 同辈元素! ),而 查找方法中的 siblings 是可以向前 向后选择的! 选择前后 所有的 同辈元素.  而且 + 号 和~ 后面最好要带上 标签, 虽然不带标签 也会自动查找到, 即:` $('span#foo~span') 和 $('span#foo~') `其实是一样的.</font>
    
    ----------------------------
    
    
    1. jquery中 的属性过滤器中的 ^, $,* 等跟等号之间的 连接, 跟我们常规的 惯例的意思基本上 是一样的, 表示开头, 结尾, 而*星号表示通配符, 即前面的/后面的内容不管, 只要是**包含**的就可以! 
    
    
    
    
    
    
    
     
    
    
    
    
    
    
    
    
    
    
    
    #####
  • 相关阅读:
    Rotation Kinematics
    离职 mark
    PnP 问题方程怎么列?
    DSO windowed optimization 代码 (4)
    Adjoint of SE(3)
    IMU 预积分推导
    DSO windowed optimization 代码 (3)
    DSO windowed optimization 代码 (2)
    OKVIS 代码框架
    DSO windowed optimization 代码 (1)
  • 原文地址:https://www.cnblogs.com/bkylee/p/8893936.html
Copyright © 2011-2022 走看看