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中的$ 符号没有什么特殊含义?!
- 关于扩展标签库的使用
标签库的作用是, 简化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} 等方式来输出.
-----====================
扩展标签库(自定义)的定义和使用
- 创建扩展标签库类文件
<?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.=' ';
}
$parseStr.="'; ?>";
return $parseStr; // 通常标签返回的都是一个 $parseStr 字符串.
}
}
- 使用标签库
首先要引入标签库:
<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种自动加载的手段:
- 是在ThinkPHP/Library目录下的 子目录都会被系统自动加载,所以, Libray\Think, Libray\Org等中的类库都可以自动加载;
- 是自定义自动加载的命名空间: 通过在模块配置文件中, 加入: 'AUTOLOAD_NAMESPACE' => array(...);
- 定义类库映射
========================================
不要犯低级错误: 书写错误, 写错关键字, 写错类名等, 这就要留意编辑器的 颜色高亮提示...
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 一个类对象的时候:
- new类名的时候, 在类路径名称前面加不加 反斜杠是 有区别的:
- 不加反斜杠,表示的是 相对路径: 总是相对于当前模块Home的当前控制器Controller下的类;即使是 你已经定义了某个 根命名空间,如果不加反斜杠,则还是/总是在Controller控制器下: 比如:
new Org\Util\Trans(), 则会认为是: \Home\Controller\Org\Util\Trans这个类
- 如果加反斜杠, 表示的是 “根命名空间”,注意:不是根路径,不是指项目根目录的路径,即不是指
../Application
这个路径。
- 不加反斜杠,表示的是 相对路径: 总是相对于当前模块Home的当前控制器Controller下的类;即使是 你已经定义了某个 根命名空间,如果不加反斜杠,则还是/总是在Controller控制器下: 比如:
因此, 如果你要实例化你 自己定义的 “根命名空间”下的类, 一定要加上这个反斜杠,表示是 根命名空间。
-
tp中的根命名空间,是有特指的,包括两种情况:
第一, 凡是 ThinkPHP/Library/ 目录下的 所有 单级子目录(注意仅仅只是指单级的子目录,更下一级的子目录则不是根namespace! )都是系统已 定义好了的 根命名空间, 可以直接使用;
其次, 在模块配置文件中 Home/Conf/config.php中, 配置的 根命名空间: -
在使用上,凡是要自动载入的类, 都应该从 根命名空间开始写起: 包括:
第一, 在定义类的时候, namespace要从根namespace写起,但是不需要加反斜杠;
第二, 在实例化类的时候, 也要从根命名空间写起,而且要在前面加反斜杠.
==============================
模板注释
- 使用{/.../} 或 {//...} 的方式, 前者可以多行注释, {和注释符之间不能有空格
- 模板注释在缓存.php中会自动被删除.
-
所有不需要被模板解析的内容, 要按原样输出的, 都可以放在 literal标签中
-
使用 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标签,就不能使用 模板/标签
======================
- 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中 的属性过滤器中的 ^, $,* 等跟等号之间的 连接, 跟我们常规的 惯例的意思基本上 是一样的, 表示开头, 结尾, 而*星号表示通配符, 即前面的/后面的内容不管, 只要是**包含**的就可以!
#####