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语法;
闭合标签是指有完整的开始标签和结束标签(关闭/闭合标签). 而开放(非闭合标签)标签是指以 / 结束的没 有另外的结束标签

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

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

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

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

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

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

所以, 判断 $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 Home\TagLib; // home是默认的根命名空间
use Think\Template\TagLib;

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" />   如果直接写, 会提示错误: "实例化一个不存在的类!:Think\Template\TagLib\My" 就是说, 如果不写路径, 会默认在系统内置的标签库存放目录 : Template\TagLib\目录中寻找...

<taglib name="Home\TagLib\my" />  而且要严格对应类的大小写: 报错:  "实例化一个不存在的类!:Home\TagLib\my" 要用 <taglib name="Home\TagLib\My" />

其次, 在使用自定义标签的时候, 要用 <my:space count="3" /> 这样的形式.

3, 为了简化上面的操作 可以定义: 'TAGLIB_PRE_LOAD' => 'My', 'TAGLIB_BUILD_IN' =>	'Cx, My', 

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

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


tp中类的加载?

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

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

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

3种自动加载的手段:

  1. 是在ThinkPHP/Library目录下的 子目录都会被系统自动加载,所以, Libray\Think, Libray\Org等中的类库都可以自动加载;
  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 Common\Library; 

class Person {
	public function __construct(){
			print  'created a person'; 
	}

}
那么在 控制器的操作中, 使用的时候 , 就可以用 : $p = new \Common\Library\Person(); 来实例化一个类了.


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

  1. new类名的时候, 在类路径名称前面加不加 反斜杠是 有区别的:
    • 不加反斜杠,表示的是 相对路径: 总是相对于当前模块Home的当前控制器Controller下的类;即使是 你已经定义了某个 根命名空间,如果不加反斜杠,则还是/总是在Controller控制器下: 比如: new Org\Util\Trans(), 则会认为是: \Home\Controller\Org\Util\Trans这个类
    • 如果加反斜杠, 表示的是 “根命名空间”,注意:不是根路径,不是指项目根目录的路径,即不是指../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中 的属性过滤器中的 ^, $,* 等跟等号之间的 连接, 跟我们常规的 惯例的意思基本上 是一样的, 表示开头, 结尾, 而*星号表示通配符, 即前面的/后面的内容不管, 只要是**包含**的就可以! 







 











#####
posted @ 2018-04-20 22:32  noitanym  阅读(295)  评论(0编辑  收藏  举报